我现在开始研究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"。 我不确定我的错误。 如果可能的话,请帮忙。
更新: 为了更具体地说明我正在做的事情,我更新了代码片段。
答案 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]
的子类型,即使ChildClass
是BaseClass
的子类型。
您可以使用存在类型(: 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
}