具有通用类型的 compareTo()
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(item)
错误是:
The method compareTo(capture#1-of ?) in the type
comparable is not applicable for the arguments
(Comparable)
我不明白我哪里弄错了?我的目标是方法 compare() 应该将数组作为可比较类型的元素。
Comparable<?>
意味着你不知道你得到的是什么Comparable
;您可能会得到 Comparable<Object>
,除非您为 Object
.
的 that 实例显式覆盖 compareTo
,否则它不起作用
正确的解决方法是在方法中引入一个类型参数,这样你关心的类型就绑定到 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);
}
我定义了一个可以容纳泛型元素的数组。现在我将 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(item)
错误是:
The method compareTo(capture#1-of ?) in the type comparable is not applicable for the arguments (Comparable)
我不明白我哪里弄错了?我的目标是方法 compare() 应该将数组作为可比较类型的元素。
Comparable<?>
意味着你不知道你得到的是什么Comparable
;您可能会得到 Comparable<Object>
,除非您为 Object
.
compareTo
,否则它不起作用
正确的解决方法是在方法中引入一个类型参数,这样你关心的类型就绑定到 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);
}