Scala:使用ArrayList的错误类型不匹配错误

时间:2014-02-10 15:48:12

标签: java scala type-inference scala-collections

任何人都可以解释为什么会出现以下错误(Scala 2.10.3)吗?

scala> new java.util.ArrayList[Integer]()
res0: java.util.ArrayList[Integer] = []

scala> res0.add(0)
res1: Boolean = true

scala> java.util.Collections.binarySearch(res0, 0)
<console>:9: error: type mismatch;
 found   : java.util.ArrayList[Integer]
 required: java.util.List[_ <: Comparable[_ >: Any]]
              java.util.Collections.binarySearch(res0, 0)
                                                 ^

以下工作正常:

scala> java.util.Collections.binarySearch[Integer](res0, 0)
res4: Int = 0

编译器会抱怨某个特定类型,直到我更明确关于该错误类型然后它会接受它,这似乎很奇怪。

编辑:

另请注意,如果您将第一步更改为:

scala> new java.util.ArrayList[Int]()

也有一个非常类似的错误。

2 个答案:

答案 0 :(得分:8)

试试这个:

java.util.Collections.binarySearch(res0, 0: Integer)

正如你所看到的,它编译得很好。 问题是0的类型为Int,而不是Integer。因此,您必须以某种方式告诉scala您要将0转换为Integer值。

按照目前的情况,您的代码会触发编译器查找方法binarySearch,该方法将ArrayList[Integer]作为其第一个参数,并将Int作为其第二个参数。

答案 1 :(得分:0)

binarySearch的定义如下:

  

使用二进制搜索算法搜索指定列表中的指定对象。

static <T> int
binarySearch(List<? extends Comparable<? super T>> list, T key)

如您所见,listkey在类型T上进行了参数化。现在,Scala编译器尝试在以下调用中推断出list的类型:

scala> java.util.Collections.binarySearch(l, 0)
<console>:9: error: type mismatch;
 found   : java.util.ArrayList[Integer]
 required: java.util.List[_ <: Comparable[_ >: Any]]
              java.util.Collections.binarySearch(l, 0)

参数listkey之间的常见类型为Any。因为前者的类型为List<Integer>,后来的类型为int,因此符合Java。因此,这将分别在Scala中转换为Integerint,如下所述:

scala> classOf[Integer]
res9: Class[Integer] = class java.lang.Integer

scala> classOf[Int]
res10: Class[Int] = int