类型不匹配:对象中引用的类型与对象扩展的特征中定义的类型不同?

时间:2013-02-23 20:23:42

标签: scala

对象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]

}

1 个答案:

答案 0 :(得分:6)

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

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

x的类型字面意思是a.Cy的类型是b.C

您的代码中的问题是您指的是C而未指定C所属的实例是什么,最终结果是它们都假定来自不同的实例

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