2015-08-19 7 views
2

Обычно я пишу сначала case class, а затем компаньон object в том же файле, справа. Но при попытке импорта объявленного в компаньоне implicit я вынужден переключить порядок объявления (и я не хочу, очевидно). Какова рекомендуемая практика для преодоления этой ситуации?Неявное разрешение для разных порядков класса и сопутствующего класса

Для конкретного случая, следующий код не работает:

object SomeLib { 
    def doSomething[T : List](t: T) = "meh" 
    } 

    case class FooWorker(x: String) { 
    import FooWorker._ // bring the implicit in scope for doSomething 
    def then(event: String) : FooWorker = { 
     copy(x = SomeLib.doSomething(event)) // requires implicit 
    } 
    } 

    object FooWorker { 
    implicit val list = List("a", "b", "c") 
    } 

Но если я объявляю object FooWorker перед тем case class FooWorker он работает. Я использую Scala 2.11.6 и SBT для тестирования. Большое спасибо!

+0

@TravisBrown Я не использую REPL. У меня есть проект sbt с одним файлом 'Main.scala' с этим внутри и простым драйвером для его проверки. Я запускаю его непосредственно с консоли (т. Е. 'Sbt run'). – ale64bit

ответ

11

Проблема связана с тем, что неявный FooWorker.list не имеет явно объявленного типа. Если вы закончите линию до:

implicit val list: List[String] = List("a", "b", "c") 

все работает должным образом, независимо от порядка деклараций. В общем, вы всегда должны указывать явный тип для неявного значения. Это правило будет применено в будущей версии Scala.

+0

Большое спасибо, что решает проблему. Из любопытства: почему явное написание меняет ситуацию вообще? Разве не распознаются импликации после того, как типы известны (явно или выведены)? – ale64bit

Смежные вопросы