Scala子listbuffer作为父listbuffer返回

时间:2015-01-06 21:39:20

标签: scala

我现在开始研究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不允许我返回一个ChildClass实例。 在Java中,这将起作用(Child是一种父类型)

我尝试更改我的方法签名以返回" Any"。 我不确定我的错误。 如果可能的话,请帮忙。

更新: 为了更具体地说明我正在做的事情,我更新了代码片段。

2 个答案:

答案 0 :(得分:1)

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)

}

答案 1 :(得分:0)

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

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

仔细查看您的代码,您可能更愿意返回List[BaseClass],这是协变的,所以您可以写:

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