【发布时间】:2011-01-04 19:12:53
【问题描述】:
我正在尝试定义一个通用容器,其元素可以返回封闭容器。比如:
abstract class Container[E <: Element] { // compile error
def contains( e: E ): Boolean
def addNewElement(): Unit
}
abstract class Element[C <: Container] { // compile error
def enclosingContainer(): C
}
class MyContainer extends Container[MyElement] {
private var elements = List[MyElement]()
override def contains( elem: MyElement ) = elements.contains( elem )
override def addNewElement() { elements ::= new MyElement(this) }
}
class MyElement( container: MyContainer ) extends Element[MyContainer] {
override val enclosingContainer = container
}
但是,sn-p 无法编译,因为我应该在abstract class Container[E <: Element] 定义中为Element 提供一个类型参数,在abstract class Element[C <: Container] 定义中为Container 提供一个类型。
我有办法实现我正在寻找的行为吗? Container 和 Element 是否有适当的声明?我应该定义第三方对象吗?
【问题讨论】:
-
粗略的猜测,因为我现在无法打开我的编译器,但你尝试过
abstract class Element[C <: Container[Element]]或类似的东西吗? -
是的,但是
Element也需要一个参数类型... -
不应该
addNewElement()带一个元素来添加吗?即addNewElement(e : E)? -
@Alexey 在这个例子中没有。在我的实际应用程序中,它采用另一种类型的实例并将其包装在正确初始化的新元素对象中。
标签: scala generics type-parameter