Неявное преобразование scala не работает
Я обнаружил странное явление:
class A {
val dual: A = this
object T {
implicit def doubleDual(t: T): dual.dual.T = t.asInstanceOf[dual.dual.T]
implicit def justForTest(t: T): Int = 777
}
class T
}
val a = new A
val t = new a.T
// import a.T._
val x: Int = t //this works!
val t1: a.dual.dual.T = t //this doesn't work!
Согласно неявному правилу поиска, метод doubleDual
в object T
следует применять. Но это не так. Я должен импортировать a.T._
вручную. Зачем?
2 ответа
Ключ "одноименный"!
class A {
val dual: A = this
object T {
implicit def doubleDual(t: T): dual.dual.T = t.asInstanceOf[dual.dual.T]
}
class T
}
val a = new A
val t = new a.T
import a.T.doubleDual //
import a.dual.dual.T.doubleDual //the same name!
val t1: a.dual.dual.T = t // won't compile
Но после переименования:
import a.T.doubleDual //
import a.dual.dual.T.{doubleDual => dd} // different name!
val t1: a.dual.dual.T = t // can compile
Согласно неявному правилу поиска, должен применяться метод doubleDual в объекте T.
Мне кажется, что поиск должен найти два следствия: a.T.doubleDual
а также a.dual.dual.T.doubleDual
Вопрос в том, почему он не дает "неявные преобразования не применимы, потому что они неоднозначны". Может потому что у них одинаковые имена?
Нет, это не правильно, a.dual.dual.T.doubleDual
имеет неправильный тип. Но я все еще подозреваю, что проблема может быть связана с T
объект появляется дважды при поиске a.T
а также a.dual.dual.T
, Просто это будет ошибка компилятора, если я не пропустил что-то еще.