我有一种感觉,我面临的问题与Scala 的类型擦除有关,但作为一个新手,我不能把手指放在它上面。在这里需要一些帮助。
首先,代码:
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,因此可以被视为成员变量,不是吗?
我已经浏览了论坛中的其他一些相关帖子,清单和类型标签是可能的出路。但是,对于这个简单的用例,我不确定是否需要达到那个级别。