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]
的子类型,即使 ChildClass
是 BaseClass
.
的子类型
您可以使用存在类型(: 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)
}
我现在开始研究 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]
的子类型,即使 ChildClass
是 BaseClass
.
您可以使用存在类型(: 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)
}