パス依存型をリフレクションで使用すると、「基底型」と一致する場合でも型の不一致エラーが発生します。これらの「非基底型」とは何か、「基礎型」の代わりにそれらをチェックするのはなぜですか?パス依存タイプと「基礎タイプ」のどちらがチェックされていますか?
以下のコードでは、compare
メソッドは、引数として同じタイプのサブクラスAのみを受け入れるようにします。エラーは最後の行にあります。私はこのエラーを取得する最後の行に
abstract class A(val a:Int) {
type Impl <: A
def compare(other:Impl) {
if(a==other.a) println("equal") else println("diff")
}
}
class B(a:Int) extends A(a) {type Impl = B}
object Test {
def newInst(a: Int, className: String) = {
val constr = Class.forName(className).getConstructors()(0)
constr.newInstance(a.asInstanceOf[AnyRef]).asInstanceOf[A]
}
def main(args: Array[String]) {
val b1 = newInst(4, "B")
val b2 = newInst(5, "B")
b1.compare(b2) // type mismatch error here
}
}
:
error: type mismatch;
found : b2.type (with underlying type A)
required: b1.Impl
B2のタイプ(A)とB1のタイプと同じであるので、私はこのエラーを生成しないことが期待。何らかの理由で、これらのパス依存型は、リフレクションを使用するときの「基底型」とは異なります。どうして?
私はリフレクションを使用しない場合、それは動作します:
val b1 = new B(4)
val b2 = new B(5)
b1.compare(b2) // no errors
(私は私の場合にはリフレクションを使用する必要があります)。 newInst()
は反射を使ってオブジェクトをクラス "B"として返すことができますか?これは役に立ちますか?抽象タイプを使用しているときにタイプ消去がありますか?
これは唯一のエラーであることがわかりましたが(on this forum)、関連していない可能性があります。
ありがとうございました!それは本当に奇妙で、回避策を見つけるために私を1日かかって、ついにあなたのポストを見ました。 –