我已经定义了一个可以容纳泛型类型元素的数组。现在我将数组[index]与另一个可比元素进行比较。以下是代码段。
我已经定义了一个可以容纳泛型类型元素的数组。现在我将数组[index]与另一个可比元素进行比较。以下是代码段。
public class Test {
void methodArr(){
final Comparable[] arr = { 1, 2, 3, 4, 5};
Integer item = 10;
compare(arr, item);
}
private int compare(Comparable<?>[] arr, Comparable<?> item) {
return arr[0].compareTo(item); //Error in this line
}
}
现在它在
的方法compare()中给出了错误ARR [0] .compareTo(项目)
错误是:
类型中的方法compareTo(捕获#1-of?) 可比较不适用于论点 (比较)
我不明白我在哪里弄错了?我的对象是方法compare()应该将数组作为可比类型的元素。
答案 0 :(得分:2)
Comparable<?>
意味着你不知道你得到了什么样的Comparable
;您可能会收到Comparable<Object>
,除非您明确覆盖{em> compareTo
实例的Object
,否则无法使用Comparable
。
对此的正确解决方法是向方法引入一个类型参数,以便您关注的类型绑定到private <T extends Comparable<T>> int compare(T[] arr, T item) {
return arr[0].compareTo(item);
}
。
Comparable[]
上述内容仍适用于Comparable<?>[]
,而不是methodArr
。泛型和数组不能很好地混合,所以尽可能避免将两者结合起来。
如果要避免未经检查的警告(此时由于数组协方差而可以安全地忽略),那么您将修改<T extends Comparable<T>> void methodArr(final T[] arr, T item) {
// use the passed-in arr and item variables instead.
}
方法的签名以接受类似的绑定。
{{1}}
答案 1 :(得分:1)
参数中的两个通配符之间没有关系。相反,您应该使用显式类型变量指定它们是相同的类型:
private <T extends Comparable<T>> int compare(T[] arr, T item) {
答案 2 :(得分:-1)
一个简单的
private <T extends Comparable> int compare(T[] arr, T item) {
return arr[0].compareTo(item);
}