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