Java 为什么列表<;对象[]>;需要显式转换才能转换为Scala集合?
假设我有以下Java集合: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.
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]]() =
到
第一个方法创建了一个方法,该方法使用nameArray
作为类型参数,其本身使用nameAnyRef
(即更高类型)作为类型参数。这些新引入的名称隐藏了内置类型Array
和AnyRef
更改
def convertMethod[Array[AnyRef]]() =
到
第一个方法创建了一个方法,该方法使用name
Array
作为类型参数,其本身使用nameAnyRef
(即更高类型)作为类型参数。这些新引入的名称隐藏了内置类型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
,但不在方法中,这是正确的