问题
I am trying to create a type class inside IntelliJ Scala Worksheet. So I started with trait like this
trait Show[A] {
def show(a : A) : String
}
and created a companion object
object Show {
def show[A](a: A)(implicit sh: Show[A]) = sh.show(a)
implicit val intCanShow: Show[Int] =
new Show[Int] {
def show(int: Int): String = s"int $int"
}
}
When I try
println(Show.show(20))
I get this error.
Error:(50, 26) could not find implicit value for parameter sh: Show[Int]
println(Show.show(20))
But when I take the intCanShow out of the object Show, it works fine. Why cannot scala acess the the implicit inside the object?
回答1:
Your example appears to work as expected when run as a scala script.
With the following in a file named test.sh
and marked executable
#!/usr/bin/env scala
trait Show[A] {
def show(a : A) : String
}
object Show {
def show[A](a: A)(implicit sh: Show[A]) = sh.show(a)
implicit val intCanShow: Show[Int] =
new Show[Int] {
def show(int: Int): String = s"int $int"
}
}
println(Show.show(20))
I observe
bash-3.2$ ./test.sh
int 20
回答2:
Implicit resolution tries companion objects so your code seems ok. However for an object to become a companion it must satisfy the following two requirements
- A companion object is an object with the same name as a class or trait, and
- is defined in the same source file as the associated class or trait.
The following warning means the second requirement is not satisfied:
defined object Show
warning: previously defined trait Show is not a companion to object Show.
Companions must be defined together; you may wish to use :paste mode for this.
To satisfy second requirement we have to use Plain
evaluation model in Scala Worksheet, or :paste
mode in Scala REPL.
Scala Worksheet Plain evaluation model
To define a companion object in IntelliJ Scala Worksheet change Run type
to Plain
like so
- Show Worksheet Settings
- Select tab
Settings for *.sc
- Change
Run type
fromREPL
toPlain
Scala REPL paste mode
As per @jwvh suggestion, make sure to enter paste mode
If a class or object has a companion, both must be defined in the same file. To define companions in the REPL, either define them on the same line or enter :paste mode.
as demonstrated here.
来源:https://stackoverflow.com/questions/57913147/could-not-find-implicit-value-inside-companion-object-in-scala-worksheet