任何人都可以解释为什么会出现以下错误(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]()
也有一个非常类似的错误。
答案 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)
如您所见,list
和key
在类型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)
参数list
和key
之间的常见类型为Any
。因为前者的类型为List<Integer>
,后来的类型为int
,因此符合Java。因此,这将分别在Scala中转换为Integer
和int
,如下所述:
scala> classOf[Integer]
res9: Class[Integer] = class java.lang.Integer
scala> classOf[Int]
res10: Class[Int] = int