Явное присвоение возвращаемого типа string2Wrapper решает проблему.
class A {
import Implicits._
def bar() {
"A" ==> "B"
"B" ==> "C"
"C" ==> "D"
}
object Implicits {
implicit def string2Wrapper(s: String): Wrapper = new Wrapper(s)
class Wrapper(s: String) {
def ==>(s2: String) {}
}
}
}
Определение Implicits
до bar
также работает:
class A {
object Implicits {
implicit def string2Wrapper(s: String) = new Wrapper(s)
class Wrapper(s: String) {
def ==>(s2: String) {}
}
}
import Implicits._
def bar() {
"A" ==> "B"
"B" ==> "C"
"C" ==> "D"
}
}
Если вам нужно положиться на неявное преобразование, определенное ниже в текущей области, убедитесь, что вы аннотировали его тип возвращаемого значения. Я уверен, что это уже упоминалось в списках рассылки раньше, и это может быть ожидаемое поведение, а не ошибка. Но я не могу найти это в данный момент. Я предполагаю, что явный вызов в foo
инициирует вывод типа возвращаемого типа bar
, который затем действителен при вводе содержимого bar
.
UPDATE
В чем опасность циклической ошибки задания?
Тело неявного метода может вызывать метод, который требует неявного преобразования. Если оба из них имеют предполагаемый тип возврата, вы находитесь в тупике. Это не относится к вашему примеру, но компилятор не пытается обнаружить это.
Почему явный вызов имеет значение?
Явный вызов ранее вызывает вывод типа возвращаемого типа неявного метода. Вот логика в Implicits.isValid
sym.isInitialized ||
sym.sourceFile == null ||
(sym.sourceFile ne context.unit.source.file) ||
hasExplicitResultType(sym) ||
comesBefore(sym, context.owner)
ОБНОВЛЕНИЕ 2
Эта недавняя ошибка выглядит актуальной: https://lampsvn.epfl.ch/trac/scala/ticket/3373