3

内部クラスを持つ Scala クラスで、そのクラスのインスタンスを引数として受け取るコンストラクターをどのように宣言できますか?

つまり、これは機能します

class Element[T](val v : T, val next : Element[T])

class MyStack[T] private (private val first : Element[T]) {
    def this() = this(null)
    def push(v : T) = new MyStack[T](new Element[T](v,first))
    def pop() = new MyStack[T](first.next)
    def top() = first.v
}

これはしません。

class MyStack[T] private (private val first : Element) {
    private class Element(val v : T, val next : Element)
    def this() = this(null)
    def push(v : T) = new MyStack[T](new Element(v,first))
    def pop() = new MyStack[T](first.next)
    def top() = first.v
}
4

2 に答える 2

2

Element外からは見えないので、外部クラスの文脈で参照する必要があります

class MyStack[T] private (first: MyStack[T]#Element) {
  class Element(val v: T, val next: MyStack[T]#Element)
  def this() = this(null)
  def push(v: T) = new MyStack[T](new Element(v, first))
  def pop() = new MyStack[T](first.next)
  def top() = first.v
}
于 2012-11-09T12:21:35.540 に答える
1

なぜこれを行う必要があるのか​​ わかりません(おそらくそれに関する情報を追加する必要があります)が、プライベート内部クラスでは可能ではありません。パラメーター自体は名前による呼び出しである必要があり、外部インスタンスの準備が整った後にのみ評価されるように、遅延 val に割り当てる必要があります。

class Foo[A](_x: => Foo[A]#Bar) {
  lazy val x = _x
  class Bar
}

scala> lazy val x: Foo[Int] = new Foo[Int](new x.Bar)
x: Foo[Int] = <lazy>

scala> x.x
res8: Foo[Int]#Bar = Foo$Bar@76ba819c
于 2012-11-09T12:48:50.093 に答える