當使用反射來使用路徑依賴類型時,即使我有匹配的「基礎類型」,我也會遇到類型不匹配錯誤。什麼是這些「非基礎類型」,爲什麼他們檢查而不是「基礎類型」?路徑依賴類型與「基礎類型」,哪些被檢查?
在下面的代碼中,我想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的類型(這是),我預計這不會產生錯誤。由於某些原因,這些路徑依賴類型在使用反射時與「基礎類型」不同。爲什麼?
如果我不使用反射,它的工作原理:
val b1 = new B(4)
val b2 = new B(5)
b1.compare(b2) // no errors
(我需要在我的情況下,使用反射)。 newInst()
可以使用反射將對象返回爲類「B」嗎?這會有幫助嗎?使用抽象類型時是否有類型擦除?
這是我發現的唯一參考文獻(on this forum)關於相同的錯誤,但它可能沒有關係。
謝謝您的詢問!這真是奇怪,花了我一天的時間找到解決方法,最後看到你的帖子。 – 2013-04-14 18:20:13