pr1001
pr1001

Reputation: 21962

Scala traits and implicit conversion confusion

The following lines work when I enter them by hand on the Scala REPL (2.7.7):

trait myTrait {
  override def toString = "something"
}
implicit def myTraitToString(input: myTrait): String = input.toString
object myObject extends myTrait
val s: String = myObject

However, if I try to compile file with it I get the following error:

[error] myTrait.scala:37: expected start of definition
[error] implicit def myTraitToString(input: myTrait): String = input.toString
[error]          ^

Why?

Thanks!

Upvotes: 7

Views: 3838

Answers (1)

luqui
luqui

Reputation: 60463

Functions can't be defined at the top level. Put myTraitToString in a (companion, if you like) object:

object myTrait {
    implicit def myTraitToString(input : myTrait) : String = input.ToString
}

And then bring it into scope:

import myTrait._

Whenever myTraitToString is in scope -- i.e. when you could call it without any dots -- it will be applied implicitly.

Upvotes: 13

Related Questions