Java 为什么列表<;对象[]>;需要显式转换才能转换为Scala集合?

Java 为什么列表<;对象[]>;需要显式转换才能转换为Scala集合?,java,scala,casting,scala-collections,Java,Scala,Casting,Scala Collections,假设我有以下Java集合: public static List<Object[]> javaStuff = new ArrayList<Object[]>(); 更具体地说,IntelliJ突出显示的错误是: 类型Buffer[Array[AnyRef]]的表达式不符合预期的类型Buffer[Array[AnyRef]] …这是非常缺乏信息的。尝试运行代码时,错误会更有帮助: Error:(18, 58) type mismatch; found : scala.

假设我有以下Java集合:

public static List<Object[]> javaStuff = new ArrayList<Object[]>();
更具体地说,IntelliJ突出显示的错误是:
类型Buffer[Array[AnyRef]]的表达式不符合预期的类型Buffer[Array[AnyRef]]

…这是非常缺乏信息的。尝试运行代码时,错误会更有帮助:

Error:(18, 58) type mismatch;
found   : scala.collection.mutable.Buffer[scala.Array[Object]]
required: scala.collection.mutable.Buffer[Array[AnyRef]]
   val r: mutable.Buffer[Array[AnyRef]] = MyTestClass.javaStuff.asScala
                                 ^
此时,我将原始代码更改为:

def convertMethod[Array[AnyRef]]() : Iterator[Array[AnyRef]] = {
   import scala.collection.JavaConverters._
   val r: mutable.Buffer[Array[AnyRef]] = MyTestClass.javaStuff.asScala.map(_.asInstanceOf[Array[AnyRef]])
   r.iterator
 }
…而且成功了

现在我的问题是:为什么这是必要的?有没有一种方法可以避免这种显式的施法

变化

def convertMethod[Array[AnyRef]]() =

第一个方法创建了一个方法,该方法使用name
Array
作为类型参数,其本身使用name
AnyRef
(即更高类型)作为类型参数。这些新引入的名称隐藏了内置类型
Array
AnyRef

更改

def convertMethod[Array[AnyRef]]() =


第一个方法创建了一个方法,该方法使用name
Array
作为类型参数,其本身使用name
AnyRef
(即更高类型)作为类型参数。这些新引入的名称隐藏了内置类型
Array
AnyRef

原因很简单。在
convertMethod
中,
Array
是一个类型参数,因此根本不引用
scala.Array

您应该更改此选项:

def convertMethod[Array[AnyRef]]()
为此:

def convertMethod()

请注意,与shadowlands在评论中所说的相反,
scala.Array
实际上与java数组是一样的(除了scala数组不是协变的,但它在这里不起作用这一事实)。在
convertMethod
中,
Array
是一个类型参数,因此根本不引用
scala.Array

您应该更改此选项:

def convertMethod[Array[AnyRef]]()
为此:

def convertMethod()

请注意,与shadowlands在评论中所说的相反,
scala.Array
实际上与java数组是一样的(除了scala数组不是协变的,但它在这里不起作用这一事实)。

scala数组与java数组不同,因此是的,有必要进行显式的额外转换(JavaConverters方法不能隐式处理嵌套转换)。我明白了。这是有道理的。那么,在我的例子中,我采用的方法是最好的吗?或者应该在
迭代器上而不是
缓冲区上进行
映射
?实际上这是错误的。scala数组与java数组是一样的(对scala中它不是协变的这一事实进行模化,但它仍然是同一个类)。我知道它们是同一个类,但我认为AnyRef和Object之间的空转换是罪魁祸首。然而,现在我阅读了您的答案,我明白了问题的真正所在。ThanksA Scala数组与Java数组不同,因此是的,有必要进行显式额外转换(JavaConverters方法不能隐式处理嵌套转换)。我明白了。这是有道理的。那么,在我的例子中,我采用的方法是最好的吗?或者应该在
迭代器上而不是
缓冲区上进行
映射
?实际上这是错误的。scala数组与java数组是一样的(对scala中它不是协变的这一事实进行模化,但它仍然是同一个类)。我知道它们是同一个类,但我认为AnyRef和Object之间的空转换是罪魁祸首。然而,现在我读了你的答案,我明白了问题的真正所在。感谢你,不要挑剔:它隐藏了
scala.Array
,而不是
AnyRef
@RégisJean Gilles,它也隐藏在类型参数列表中
AnyRef
,但不在方法中,这是一个小错误:它在类型参数列表中隐藏
scala.Array
,但不隐藏
AnyRef
@RégisJean Gilles,它也隐藏
AnyRef
,但不在方法中,这是正确的