0

对象O扩展了T1具有已定义类型的特征C

T1我想操作stackobject 中定义的静态数据结构O。但是编译器一直在抱怨

找到 T1.this.C 的类型不匹配,需要 OC

代码如下:

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?我在这里想念什么?我该怎么做?

更新

根据一个建议放入Cobject T1,但在我的真实示例中,对象T1无法访问 trait 中定义的类型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]

}
4

1 回答 1

6

嵌套类属于其父类的一个实例。也就是xy下面的类型不同:

val a = new T1 {}
val b = new T2 {}
val x = new a.C(0, "")
val y = new b.C(0, "")

is的类型x,字面意思是 ,a.C的类型yb.C

您的代码中的问题是您所指的是C没有指定属于哪个实例的实例,C最终结果是它们都被假定来自不同的实例。

嵌套类很有用,但由于其非常严格的语义而难以使用。

于 2013-02-23T20:40:23.510 回答