Scala 子列表缓冲区作为父列表缓冲区返回

Scala child listbuffer returned as parent listbuffer

我现在开始研究 Scala。到了我想正确使用继承的地步。

我卡在了原地。我曾尝试在线阅读文档和其他信息。但我似乎被困住了。 请看看这个并告诉我你过去是否遇到过这个问题,以及我是否做错了什么。

所以,这是我的方法:

 def getFacethierarchy): ListBuffer[BaseClass] = {
      val obj: Childclass = new ChildClass(1, "2")
      val list: ListBuffer[ChildClass] = ListBuffer[ChildClass]()
      list += obj
      list
  }


class BaseClass(var id: Int){
}

class ChildClass(id: Int, var name: String) extends BaseClass(id){
}

现在 scala 不允许我 return 一个 ChildClass 实例。 在 Java 中,这会起作用(Child 是 Parent 的一种)

我试图将我的方法签名更改为 return "Any"。 我不确定我出了什么问题。 如果可能,请帮忙。

更新: 为了更具体地说明我在做什么,我更新了代码片段。

问题源于ListBuffer是不变的,而不是协变的(T之前没有+)。它不能是协变的。因此,ListBuffer[ChildClass] 不是 ListBuffer[BaseClass] 的子类型,即使 ChildClassBaseClass.

的子类型

您可以使用存在类型(: ListBuffer[T] forSome {type T <: BaseClass}(希望我使用了正确的语法)),或者为您要使用的方法提供额外的类型参数(yourMethod[T <: BaseClass]: ListBuffer[T])。如果你想要 "MyTypes"(如果没有进一步的细节,可能很难说):Scala do not support it.

仔细查看您的代码,您可能更喜欢 return a List[BaseClass],这是协变的,因此您可以这样写:

 def getFacethierarchy: List[BaseClass] = {
      val obj: Chlidclass = new ChildClass(1, "2")
      val list: ListBuffer[ChildClass] = ListBuffer[ChildClass]()
      list += obj
      list.toList
 }

ListBuffer[ChildClass] 不是 ListBuffer[BaseClass] 的子类型,因为 ListBuffer 是一个可变数据结构,它会破坏类型安全。

您想避免以下情况:

val l : ListBuffer[Int] = ListBuffer[Int](1, 2, 3)
val l2 :ListBuffer[Any] = l
l2(0) = 2.54

你可以做的就是简单地创建一个 ListBuffer[BaseClass]:

def getFacethierarchy): ListBuffer[BaseClass] = {
  val obj: Chlidclass = new ChildClass(1, "2")
  ListBuffer[BaseClass](obj)

}