我正在尝试在抽象类中声明一个方法,该类接收一个泛型类型为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扩展这个类。
答案 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