0

オブジェクトは型が定義されOた特性を拡張します。T1C

object で定義されたT1静的データ構造を操作したい。しかし、コンパイラは不平を言い続けますstackO

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に入れる1つの提案に基づいています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

Nested classes belong to an instance of their parent class. That is, the types of x and y below are different:

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

The type of x is, literally, a.C, and the type of y is b.C.

The problem in your code is that you are referring to C without specifying what's the instance to which that C belongs to, with the end result being that they are all assumed to be from different instances.

Nested classes are useful, but difficult to use due to their very strict semantics.

于 2013-02-23T20:40:23.510 に答える