Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
901 views
in Technique[技术] by (71.8m points)

intellij idea - Could not find implicit value inside companion object in Scala Worksheet

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?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

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

  1. A companion object is an object with the same name as a class or trait, and
  2. 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

  1. Show Worksheet Settings
  2. Select tab Settings for *.sc
  3. Change Run type from REPL to Plain

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...