类型Any的表达式不符合预期的类型_ $ 1

时间:2016-06-16 13:20:06

标签: scala

我对未完成的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.valuesomeB.newValue都有相同的类型,但Scala的编译器实际上并不这么认为。如何修复此错误?

2 个答案:

答案 0 :(得分:1)

不要期望编译器弄清楚两个存在是相同的,即使它们显然必须存在。解决方法:

  1. 使用类型变量模式:

    list.head match {
      case someB: B[a] => someB.a.value = someB.newValue
    }
    
  2. 提取方法:

    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