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 回答