Scala Harits и неявная конверсионная путаница
-
27-09-2019 - |
Вопрос
Следующие строки работают, когда я ввожу их вручную на 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
Однако, если я пытаюсь скомпилировать файл с ним, я получаю следующую ошибку:
[error] myTrait.scala:37: expected start of definition
[error] implicit def myTraitToString(input: myTrait): String = input.toString
[error] ^
Почему?
Спасибо!
Решение
Функции не могут быть определены на верхнем уровне. Помещать myTraitToString
В (компаньон, если хотите) объект:
object myTrait {
implicit def myTraitToString(input : myTrait) : String = input.ToString
}
А затем принести его в область применения:
import myTrait._
Всякий раз, когда MytraittoString находится в области применения - то есть, когда вы можете назвать это без каких-либо точек - оно будет применено неявно.
Не связан с StackOverflow