私が直面している問題は、Scala のType Erasureに関係しているように感じますが、初心者としては指を置くことができません。ここで助けが必要です。
まず、コード:
class C (val i: Int) {
def mkString() = { println("C.i =" + this.i) }
object C {
implicit val cOrdering = new Ordering [C]
{
def compare (a: C, b: C)=
{
a.i compare b.i;
}
}
次に、クラス 'C' のコレクションを保持する別のクラスを次のように作成します。
class ContainerOfC [C] (s:Int) (implicit ordering: cOrdering[C]) {
var internalCollection = new TreeSet[C]()
def + (c:C): ContainerOfC [C] = {
this.internalCollection += c
this
}
def mkStringOfElems () = {
val y = this.internalCollection.toList
println (y.head.i) // <--- Problem here
}
}
これはREPLが私に言うことです:
error: value i is not a member of type parameter C
println(y.head.i)
^
そこにある「y」のタイプを確認しました。これは List[C] です。もしそうなら、なぜ「i」へのアクセスが許可されていないのですか? 構築パラメータならいいけど、valだからメンバー変数として扱えるんじゃないの?
私はフォーラムで他の関連する投稿をいくつか見てきましたが、マニフェストとタイプタグはここから抜け出す方法として考えられます。しかし、この単純なユースケースでそのレベルに行く必要があるかどうかはわかりません。