解决方案:
我们先来看一个例子,如果你不制定集合类型,那么Scala会自动给List指定一个Double类型
scala> val l = List(1, 2.0, 33D, 400L)l: List[Double] = List(1.0, 2.0, 33.0, 400.0)
如果你想指定集合类型为Number或者AnyVal,那么你必须在集合声明后的[]中加入你指定的类型。
scala> val l = List[Number](1, 2.0, 33D, 400L)l: List[Number] = List(1, 2.0, 33.0, 400)scala> val l = List[AnyVal](1, 2.0, 33D, 400L)l: List[AnyVal] = List(1, 2.0, 33.0, 400)
讨论:
通过手动设定,你可以指定一个集合的类型。通常情况下,这用于集合内容为混合类型活着有着多层结构的类型,比如继承,实现等。下面我们来看一个带有层级关系的例子:
scala> trait Animaldefined trait Animalscala> trait FurryAnimal extends Animaldefined trait FurryAnimalscala> case class Dog(name: String) extends Animaldefined class Dogscala> case class Cat(name: String) extends Animaldefined class Cat
我们使用Dog和Cat的失利来创建一个Sequency
scala> val l = Array(Cat("Tom"), Dog("DaHuang"))l: Array[Product with Serializable with Animal] = Array(Cat(Tom), Dog(DaHuang))
这正如你看到的,Scala自动给出的集合类型是Array[Product with Serializable with Animal],如果你想指定集合类型是Array[Animal],那么你必须手动指定:
scala> val l = Array[Animal](Cat("Tom"), Dog("DaHuang"))l: Array[Animal] = Array(Cat(Tom), Dog(DaHuang))