我发现了一个奇怪的现象:
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._
。为什么呢?
答案 0 :(得分:1)
根据隐式搜索规则,应该应用对象T中的doubleDual方法。
在我看来,搜索应该找到两个含义: a.T.doubleDual
和a.dual.dual.T.doubleDual
问题是它为什么不给出“隐式转换不是适用,因为它们含糊不清“错误。也许是因为他们有相同的名字?
不,那是错的,a.dual.dual.T.doubleDual
的类型错误。但我仍然怀疑问题可能与搜索T
和a.T
时出现两次的a.dual.dual.T
对象有关。这只是一个编译器错误,除非我错过了别的东西。
答案 1 :(得分:0)
关键是"同名"!
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