Java Scala泛型数组
我试图在一个抽象类中声明一个方法,该类接收泛型类型T的数组。因此:Java Scala泛型数组,java,scala,scala-2.8,Java,Scala,Scala 2.8,我试图在一个抽象类中声明一个方法,该类接收泛型类型T的数组。因此: abstract class Circle[-T] extends Shape[T] { def draw(points: Array[T]): Unit } 我遇到的问题是Scala编译器抱怨: 逆变型T出现在 的类型数组[T]中的不变位置 价值点 那么,除了以下几点之外,还有其他解决方法吗 def draw[U <: T](points: Array[U]): Unit def draw[UScala的数组直
abstract class Circle[-T] extends Shape[T] {
def draw(points: Array[T]): Unit
}
我遇到的问题是Scala编译器抱怨:
逆变型T出现在
的类型数组[T]中的不变位置
价值点
那么,除了以下几点之外,还有其他解决方法吗
def draw[U <: T](points: Array[U]): Unit
def draw[UScala的数组直接映射到Java数组,并且是不变的([T]
而不是[+T]
)
数组是一个棘手的问题。它是JVM上唯一被具体化的东西,众所周知,数组差异是故意打破的,这样可以实现像Array.sort()这样的方法
您最好在这里使用“真正的”Java集合
要回答更一般的问题:是的,如果您想在逆变类的方法中使用参数化不变类型,您必须在签名中指定与问题相关的方法的上界。您可以
scala>导入scala.annotation.unchecked.uncheckedVariance
导入scala.annotation.unchecked.uncheckedVariance
scala>抽象类圆[-T]扩展形状[T@uncheckedVariance]{
|def draw(points:Array[uu.抽象类圆圈[t注意Java数组是协变的,看起来很奇怪。Scala的不变性会导致一些问题,特别是当方法期望对象[]
@missingfactor时,Scala提供了太多:)嗯,虽然它是编译的,但是当从Java调用draw方法时,我得到以下错误:Circle:method()V notfound@halfwarp是否使用了注释或视图边界?
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