1.通过私有构造器及工厂方法
class A private {
private val leading:List[Int],
...
}
...
然后在伴生对象里调用该类,或者添加辅助构造器
def this() = this(Nil,Nil)
2.通过私有类
trait Queue[+T] {
def head:T
def tail:Queue[T]
def append[U>:T](x:U):Queue[U]
}
object Queue {
def apply[T](xs:T*):Queue[T] = new QueueImpl[T](xs.toList,Nil)
private class QueueImpl[T] (
private[QueueImpl] val leading:List[T],
private[QueueImpl] val trailing:List[T]
)extends Queue[T]{
def mirror = if(leading.isEmpty) new QueueImpl(trailing.reverse,Nil)
else
this
def head:T = mirror.leading.head
def tail:QueueImpl[T] = {
val q = mirror
new QueueImpl(q.leading.tail,q.trailing)
}
def append[U>:T](x:U) =
new QueueImpl(leading,x::trailing)
}
}
记得在协变时,方法不可直接使用泛态变量,必须给定下界