6

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定義したのと同じ型が生成されると予想さfooBaseます。

言い換えれば、私はそれを期待し、完全に同等の型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を返す根本的な理由(そうでなければ技術的)がありますか?

4

1 に答える 1