我偶然發現3210應用於類型轉換時令人費解的行爲。 考慮:結構類型細化和類型相等
import reflect.runtime.universe._
type T1 = AnyRef {
def apply(name: String): Unit
def foo: String
}
type Base = { def apply(name: String): Unit }
type T2 = Base {
def foo: String
}
鑑於Base
是一種細化的別名,我會預計,通過將會員foo
將 進一步完善它產生我彷彿就在Base
定義foo
同一類型。
換句話說,我認爲T1
和T2
表示完全等效的類型。
大多數情況下,scalac似乎同意。 例如我可以通過其中T1
一個實例,預計T2
一個實例:
def f(x: T1){}
f(null: T2) // scalac does not complain here
反之:
def g(x: T2){}
g(null: T1) // scalac is still happy
我也可以要求一個證據T1 =:= T2
並將其編譯太細:
implicitly[T1 =:= T2]
但是,使用scala反射I ge牛逼完全不同的結果:
scala> typeOf[T1] =:= typeOf[T2]
res2: Boolean = false
所以這是一個階反射的bug(我猜),又或者是有一個根本的原因(技術的其他方面)爲什麼typeOf[T1] =:= typeOf[T2]
將返回false?
'TYPEOF [T1] <
這是一個很好的觀察。那麼至少有一些*一致性。另一件好事是它至少爲我提供了一個解決方法:我可以測試'(typeOf [T1] <: