【发布时间】:2013-01-24 22:29:32
【问题描述】:
我有一种感觉,我面临的问题与 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,因此可以被视为一个成员变量,不是吗?
我浏览了论坛中的其他一些相关帖子,清单和类型标签是可能的出路。但是,对于这个简单的用例,我不确定是否需要达到那个级别。
【问题讨论】:
-
你知道...我很想回答这个问题,但你的代码格式严重错误,无法编译。你能把它清理干净,让它完整和独立(包括所需的进口)吗? (特别是,不要使用语言不需要的大括号。)
-
@RandallSchulz:代码无法编译,因为它无法编译,而这正是问题所在。不过,我应该添加“导入” - 感谢您指出这一点 - 额外的标签是从 REPL 匆忙复制的结果。当我问下一个时,我会记住这一点。
标签: scala collections types type-erasure