对象O
扩展了一个定义了T1
类型的特征C
。
在T1
中,我想操纵对象stack
中定义的静态数据结构O
。
但编译器继续抱怨
发现T1.this.C的类型不匹配,需要O.C
代码如下:
trait T1 {
case class C(i: Int, s: String)
def dumbAdd(i: Int, s: String) = {
O.stack.push(C(i, s)) // type mismatch error goes here.
}
}
object O extends T1 {
var stack: Stack[C] = new Stack[C]
}
我感到困惑... O
不知道C
并且应该与T1
中的类型相同?
我在这里错过了什么?
我怎么能做我想做的事呢?
更新
基于将C
置于对象T1
中的一个建议,但在我的实际示例中,对象T1
无法访问特征T1
中定义的类型。减少的问题如下:
trait T1 {
abstract sealed class S
case class SC extends S
def dumbAdd(i: Int, s: String) = {
O.stack.push(C(i, s))
}
}
object T1 {
case class C(i: Int, s: String)
def tryASC {
val scc = SC() // Here the compiler says not found value SC
}
}
object O extends T1 {
var stack: Stack[C] = new Stack[C]
}
答案 0 :(得分:6)
嵌套类属于其父类的实例。也就是说,下面x
和y
的类型不同:
val a = new T1 {}
val b = new T2 {}
val x = new a.C(0, "")
val y = new b.C(0, "")
x
的类型字面意思是a.C
,y
的类型是b.C
。
您的代码中的问题是您指的是C
而未指定C
所属的实例是什么,最终结果是它们都假定来自不同的实例
嵌套类很有用,但由于它们的语义非常严格而难以使用。