Scala通用数组

时间:2010-10-15 13:11:24

标签: java scala scala-2.8

我正在尝试在抽象类中声明一个方法,该类接收一个泛型类型为T的数组。这样:

abstract class Circle[-T] extends Shape[T] {
   def draw(points: Array[T]): Unit
}

我遇到的问题是Scala编译器抱怨:

  

逆变型T出现在   类型Array [T]中的不变位置   价值点

那么,除了以下之外,还有解决方法吗?

def draw[U <: T](points: Array[U]): Unit

作为一个注释,我还需要用Java扩展这个类。

2 个答案:

答案 0 :(得分:4)

Scala的Array直接映射到Java数组,并且是不变的([T]而不是[+T]

阵列是一个棘手的野兽。它是唯一可以在JVM上实现的东西,并且众所周知,数组方差是故意破坏的,因此可以实现像Arrays.sort()这样的方法。

在这里使用“真正的”Java集合可能会更好。

回答更一般的问题:是的,如果要在反变体类的方法中使用参数化不变类型,则必须在该方法的签名中指定上限

答案 1 :(得分:3)

this问题相关。您可以skip check for variance

scala> import scala.annotation.unchecked.uncheckedVariance
import scala.annotation.unchecked.uncheckedVariance

scala> abstract class Circle[-T] extends Shape[T @uncheckedVariance] {
     |    def draw(points: Array[_<:T]): Unit
     | }
defined class Circle

或使用视图绑定

scala> abstract class Circle[T<%T] extends Shape[T]{
     | def draw(points: Array[_<:T]): Unit
     | }
defined class Circle