gpt4 book ai didi

java - ListBuffer[BaseType] 中的协方差/子类型

转载 作者:行者123 更新时间:2023-11-29 06:57:43 25 4
gpt4 key购买 nike

我有三个类,它们都实现了类似的功能,但在细微的细节上有所不同。我想创建一个抽象基类并将共享的代码移动起来。现在我卡住了。

每个子类都有一个 ListBuffer 保存另一个关系的对象,这是一些基本类型的子类。更具体地说:

trait data {
def parseXML();
}

trait ConcreteDataA extends Data {
override def parseXML(): Unit = {...}
}

abstract class Worker {
protected var data: ListBuffer[Data] = _

def loadXML(): Unit = {
val path: String = getPath()
... // Parse XML-file at path and put data into data-ListBuffer
}

def getPath(): String;
}

object ConcreteWorkerA extends Worker {
data = new ListBuffer[ConcreteDataA] // Here the expected type differs

override def getPath(): String = {
return "pathTo/ConcreteWorkerA/s/WorkingPlace"
}
}

我不确定如何最好地解决这个问题,感谢任何意见

最佳答案

您可以为通用参数使用通配符类型:ListBuffer[_ <: Data] .您还可以使用参数 T <: Data 使整个类/特征通用, 然后将变量声明为 ListBuffer[T] .

您还应该考虑为什么要在这里使用抽象类。你可以阅读here关于抽象类相对于特征的(很少)优势。您可能还会重新考虑为什么 data被声明为 var ,以及为什么它在 Worker 中被实例化.您可以像这样重构您的类型:

trait Worker[T <: Data]
{
protected val data: ListBuffer[T] //Not var, and uninstantiated
def loadXML: Unit = ???
def getPath: String
}

object ConcreteWorkerA extends Worker[ConcreteDataA]
{
override val data = new ListBuffer[ConcreteDataA] // Here the expected type differs
override def getPath: String = "foo"
}

关于java - ListBuffer[BaseType] 中的协方差/子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31439104/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com