[英]compareTo() with generic type
我定义了一个可以容纳通用类型元素的数组。 现在,我正在将array [index]与另一个可比较的元素进行比较。 下面是代码片段。
我定义了一个可以容纳通用类型元素的数组。 现在,我正在将array [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(capture#1-of?)方法不适用于自变量(Comparable)
我不明白我在哪里犯错? 我的对象是compare()方法应该将数组作为可比较类型的元素。
Comparable<?>
表示您不知道要获得哪种Comparable
; 你可能会得到Comparable<Object>
这是不行的,除非你明确覆盖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.
}
参数中的两个通配符之间没有关系。 相反,您应该使用显式类型变量将它们指定为相同类型:
private <T extends Comparable<T>> int compare(T[] arr, T item) {
一个简单的
private <T extends Comparable> int compare(T[] arr, T item) {
return arr[0].compareTo(item);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.