我对未完成的Scala类型系统存在问题。
class A[T](var value: T)
class B[T](val a: A[T], var newValue: T)
val list = new MutableList[B[_]]()
val a: A[Int] = new A(10)
val b: B[Int] = new B(a, 11)
list += b
val someB = list.head
someB.a.value = someB.newValue
编译后我看到错误:
Error:(12, 24) type mismatch;
found : A$A36.this.someB.newValue.type (with underlying type _$1)
required: _$1
someB.a.value = someB.newValue
^
someB.a.value
和someB.newValue
都有相同的类型,但Scala的编译器实际上并不这么认为。如何修复此错误?
答案 0 :(得分:1)
不要期望编译器弄清楚两个存在是相同的,即使它们显然必须存在。解决方法:
使用类型变量模式:
list.head match {
case someB: B[a] => someB.a.value = someB.newValue
}
提取方法:
def setValue[A](b: B[A]) = b.a.value = b.newValue
setValue(someB)
答案 1 :(得分:0)
我发现的一个解决方案是用抽象类型消除存在类型的使用。
class A[T](var value: T)
abstract class B {
type T
val a: A[T]
val newValue: T
}
val list = new mutable.MutableList[B]()
val aa = new A(10)
val b = new B {
type T = Int
val a = aa
val newValue = 11
}
list += b
val someB = list.head
someB.a.value = someB.newValue