Неявное преобразование 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, Просто это будет ошибка компилятора, если я не пропустил что-то еще.

Другие вопросы по тегам