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

说我有以下Java集合:为什么列表<Object[]>需要显式转换才能转换为Scala集合?

public static List<Object[]> javaStuff = new ArrayList<Object[]>(); 

而且,从斯卡拉,我想指的是收集,将其转换斯卡拉收集和在它返回一个Iterator[]

任何人都可以向我解释为什么下面的(玩具)代码不能编译?

def convertMethod[Array[AnyRef]]() : Iterator[Array[AnyRef]] = { 

import scala.collection.JavaConverters._

val r: mutable.Buffer[Array[AnyRef]] = MyTestClass.javaStuff.asScala // This does not compile!

r.iterator

}

更具体地说,错误的IntelliJ亮点在于:
Expression of type Buffer[Array[AnyRef]] does not conform to expected type 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

}

...和它的工作!

现在我的问题确实是:为什么这是必要的?有没有办法避免显式的转换?

回答:

原因很简单。在convertMethod中,Array是一个类型参数,因此而不是完全参考scala.Array

你应该改变这样的:

def convertMethod[Array[AnyRef]]() 

这样:

def convertMethod() 

注意,相反的是影子大地的评论说,scala.Array真的是同样的事情作为一个Java数组(除scala数组并非协变的事实,但在这里并没有发挥作用)。

回答:

变化

def convertMethod[Array[AnyRef]]() = 

def convertMethod() = 

第一个创建采取与名称Array类型参数,其通过本身需要名AnyRef的类型参数(即,更高kinded的方法类型)。这些新引入的名称隐藏了内置的类型ArrayAnyRef

以上是 为什么列表&lt;Object[]&gt;需要显式转换才能转换为Scala集合? 的全部内容, 来源链接: utcz.com/qa/264703.html

回到顶部