2014-02-10 144 views
1

任何人都可以解释为什么会出现以下错误(斯卡拉2.10.3)?斯卡拉:错误的类型不匹配错误使用ArrayList

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]() 

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

回答

8

试试这个:

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

正如你所看到的,它编译罚款。 问题是0的型号为Int,而不是Integer。所以你不得不告诉scala你想将0转换成Integer的值。

就目前而言,您的代码会触发编译器查找binarySearch方法,其中第一个参数为ArrayList[Integer],第二个参数为Int

+0

有道理,但我仍然不知道我知道消息的逻辑。是不是'Integer'不符合'_ <:Comparable [_>:Any]',但是'Int'呢? – david

+0

那么编译器不知道错误是来自第一个参数的类型,还是来自第二个(或两个)的类型。 所有它可以告诉的是,这种类型的组合是无效的(没有'binarySearch'方法可以将'ArrayList [Integer]'作为它的第一个参数,而'Int'作为它的第二个方法。如果编译器只是说它不能发出给定输入类型的呼叫,而不是发出可能导致您认为只有第一个参数有故障的消息,那么更好。 –

+0

但是,如果我执行完全相同的步骤,只是将初始'List'创建更改为'new java.util.ArrayList [Int]()',我会得到相同的错误!你的解释不应该这样做吗?谢谢。 – david

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。因此,这分别转换在斯卡拉Integerint,解释如下:

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

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

,那么编译器就是正确的抱怨。请参阅我添加的编辑。 – david

+0

@david:是的,现在很合理:-) – tuxdna