Type.=:=
型の絞り込みに適用されたときの不可解な動作に出くわしました。検討:
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
定義したのと同じ型が生成されると予想さfoo
れBase
ます。
言い換えれば、私はそれを期待し、完全に同等の型T1
を示します。T2
ほとんどの場合、scalac は同意しているようです。例として、 のインスタンスが期待されるT2
場所に のインスタンスを渡すことができます。T1
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 リフレクションを使用すると、まったく異なる結果が得られます。
scala> typeOf[T1] =:= typeOf[T2]
res2: Boolean = false
typeOf[T1] =:= typeOf[T2]
それで、これはscalaリフレクションのバグですか(私はそう推測します)、それともfalseを返す根本的な理由(そうでなければ技術的)がありますか?