所以我一直在研究我的项目中的重构,将Vector
的代码转换为Array
的。原因是我的应用程序需要非常高效,并且使用Array
的while-iterations比在Vector
上的理解和迭代要快得多。 (请参阅this blog post for details)斯卡拉阵列泛型vs向量泛型
但是我遇到了一个问题,我似乎无法轻松找到答案。我调整了我的代码来隐藏实现细节,并简化为需要强调此问题的代码。
下面的类结构,采用Vector
时,编译完全罚款:
sealed abstract class BaseClass {
def element: Int
}
sealed abstract class TypeA extends BaseClass {
def element = 2
def children: Vector[BaseClass]
}
case class TypeB(element: Int = 2) extends BaseClass
case class TypeAA(children: Vector[TypeA]) extends TypeA
case class TypeAB(children: Vector[TypeB]) extends TypeA
现在,使用Vector
切换到使用Array
时,不再编译:
sealed abstract class BaseClass {
def element: Int
}
sealed abstract class TypeA extends BaseClass {
def element = 2
def children: Array[BaseClass]
}
case class TypeB(element: Int = 2) extends BaseClass
case class TypeAA(children: Array[TypeA]) extends TypeA
case class TypeAB(children: Array[TypeB]) extends TypeA
我得到的对于TypeAA和TypeAB类错误:overriding method children in class TypeA of type => Array[BaseClass]; value children has incompatible type
。
我有一种感觉,我需要做一个隐式转换的地方,但我相对较新的斯卡拉(只有几个月),我不确定如何使用它。
对不起,如果这已被问到别处,我无法找到正确的搜索条件,我遇到的问题。
的问题是' Array'在Scala中不变,而Vector是协变的。这意味着'Vector [TypeA]'是Vector [BaseClass]的子类型,但是Array [TypeA]不是Array [BaseClass]的子类型。 –