Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Scala泛型数组_Java_Scala_Scala 2.8 - Fatal编程技术网

Java Scala泛型数组

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的数组直

我试图在一个抽象类中声明一个方法,该类接收泛型类型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的数组直接映射到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