将私有类实例作为构造函数参数

时间:2012-11-09 11:52:01

标签: scala

在具有内部类的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
}

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分: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