2016-06-16 16 views
2

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のコンパイラは、実際にはそうは思いません。どのようにこのエラーを修正することができますか?

+0

'list.head'の型は' B [_] 'です。つまり、内部型は保持されません:' case class C [T](v:T); [C [_]](C(1)、C(123)) 'リストを表示する[C [_]] =コンパイルすると、整数を文字列に割り当てることができます。 –

答えて

1

コンパイラが明らかに2つの存在感を理解するとは思わないでください。回避策:メソッドの抽出

list.head match { 
    case someB: B[a] => someB.a.value = someB.newValue 
} 
    1. 型可変パターンを使用して、私が見つけた解決策の

      def setValue[A](b: B[A]) = b.a.value = b.newValue 
      setValue(someB) 
      
  • +0

    ありがとうございます。あなたのソリューションは仕事をしています。 – Daryl

    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 
    
    関連する問題