使用子类列表创建基类列表

时间:2014-07-31 07:52:52

标签: list scala inheritance types

我有一个基类(Child1, Child2)的两个子类(Parent)。

我有一个包含子类对象的列表(kids)。我想从typedKids创建一个List[Parent]类型的新列表(kids)。

正如您在下面的REPL会话中所看到的,我可以通过直接将invidiuals元素添加到有效的列表val typedKidsWorks : List[Parent] = List(c1,c2,c3,c4)来创建列表。但是,val typedKids : List[Parent] = List(kids)并非如此。知道我在这里失踪的是什么吗?

scala> abstract class Parent
defined class Parent

scala> case class Child1(name:String) extends Parent
defined class Child1

scala> case class Child2(name:String) extends Parent
defined class Child2

scala> val c1 = Child1("first")
c1: Child1 = Child1(first)

scala> val c2 = Child2("second")
c2: Child2 = Child2(second)

scala> val c3 = Child1("third")
c3: Child1 = Child1(third)

scala> val c4 = Child2("fourth")
c4: Child2 = Child2(four)

scala> val kids = List(c1,c2,c3,c4)
kids: List[Product with Serializable with Parent] = List(Child1(first), Child2(second), Child1(third), Child2(four))

//how to make this work ? 
scala> val typedKids : List[Parent] = List(kids)
<console>:40: error: type mismatch;
 found   : List[Product with Serializable with Parent]
 required: Parent
       val typedKids : List[Parent] = List(kids)

//this works 
scala> val typeKidsWorks : List[Parent] = List(c1,c2,c3,c4)
typeKidsWorks: List[Parent] = List(Child1(first), Child2(second), Child1(third), Child2(four))


                                  ^

2 个答案:

答案 0 :(得分:3)

kids已经是List[Parent]。您无需再次致电List。除了作业之外,你不需要做任何事情。

val typedKids: List[Parent] = kids

或者(虽然没有理由这样做),你也可以写:

val typedKids: List[Parent] = List(kids:_*)

答案 1 :(得分:0)

List(kids)的类型签名是

List[List[Product with Serializable with Parent]]

正确的表格是

val typedKids : List[Parent] = kids

因为kids已经是一个类列表Parent

相关问题