当使用带有反射的路径相关类型时,即使我有匹配的“基础类型”,我也会收到类型不匹配错误。这些“非基础类型”是什么?为什么要检查它们而不是“基础类型”?
在下面的代码中,我希望该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 的类型与 b1 的类型(即 A)相同,因此我希望这不会产生错误。由于某种原因,这些依赖于路径的类型在使用反射时不同于“基础类型”。为什么?
如果我不使用反射,它会起作用:
val b1 = new B(4)
val b2 = new B(5)
b1.compare(b2) // no errors
(在我的情况下,我确实需要使用反射)。可以newInst()
使用反射将对象作为“B”类返回吗?这会有帮助吗?使用抽象类型时是否有类型擦除?
这是我发现(在这个论坛上)关于相同错误的唯一参考,但它可能不相关。