以下代码将Scala List
转换为java.util.List
(在Scala 2.11中测试)
import scala.collection.JavaConverters._
val a = List(1, 2, 3)
val b = a.asJava
但是,转换结果似乎不完整。因为java.util.List
中的某些方法不起作用。
scala> b.remove(2)
java.lang.UnsupportedOperationException
at java.util.AbstractList.remove(AbstractList.java:161)
... 29 elided
我的解决方法如下:
val c = new java.util.ArrayList(a.asJava)
这有效但在API设计方面似乎是多余的。
这是使用asJava
方法的正确方法吗?
为什么Scala的JavaConverters会产生不完整的结果?
答案 0 :(得分:2)
看起来你从asJava获得的是一个不可变列表,因为你已经开始使用不可变的Scala列表。请尝试以下
val a = List(1,2,3).to[scala.collection.mutable.ListBuffer].asJava
答案 1 :(得分:2)
因为
java.util.List
中的某些方法不起作用。
这些方法是显式可选的,因为java.util.List
涵盖了可变列表和不可变列表,Java标准库中的一些实现也不支持它们:
从此列表中删除指定元素的第一个匹配项(如果存在)(可选操作)...
抛出:... UnsupportedOperationException - 如果此列表不支持删除操作
其他Java集合接口也是如此。所以结果 完全满足界面。