为什么列表<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的方法类型)。这些新引入的名称隐藏了内置的类型Array
和AnyRef
。
以上是 为什么列表<Object[]>需要显式转换才能转换为Scala集合? 的全部内容, 来源链接: utcz.com/qa/264703.html