有人可以解释<T extends Number & Comparable<T>>
和T extends Comparable<? extends Number>
之间的区别吗?
这些看起来与我类似,并且它们都适用于子类类型。无效类型args显示以下错误
类型参数不在绑定参数范围内;应该实现 'java.lang.Number中'
和
类型参数不在绑定参数范围内;应该延长 'java.lang.Comparable的&GT;'
分别
答案 0 :(得分:2)
您无法使用:
Comparable<? extends Number>
因为Comparable
定义的唯一方法是使用者(在PECS意义上):它需要接受? extends Number
类型的实例到其{ {1}}方法 - 并且没有任何类型可以安全地满足该范围。
compareTo
是Integer
,但Comparable<? extends Number>
也是Double
。因此,您无法安全地拨打instance1.compareTo(instance2)
,因为如果这些实例分别具体Integer
和Double
,则会失败,因为Integer.compareTo
只能接受Integer
参数。
因此,编译器会阻止您首先调用此方法。
答案 1 :(得分:1)
选项1:
public class A <T extends Number & Comparable<T>>{}
您的通用参数应该扩展数字和实现Comparable, 这意味着A类是一个数字和可比较的。
选项2:
public class B <T extends Comparable<? extends Number>>{}
T与数字相当(只能比较数字),但不一定是数字,与选项1不同
我将通过示例解释:
<强> A 强>
public class A <T extends Number & Comparable<T>>{}
<强>乙强>
public class B <T extends Comparable<? extends Number>>{}
IntegerWrapper (选项2)
public class IntegerWrapper implements Comparable<Integer> {
Integer number;
public IntegerWrapper(int number) {
this.number = number;
}
@Override
public int compareTo(Integer o) {
return number.compareTo(o);
}
}
<强> GenericsTest 强> 公共类GenericsTest {
public static void main(String args[]){
A myA = new A<Integer>();
B myB = new B<IntegerWrapper>();
}
}
我认为选项1是您正在寻找的,因为我无法想到选项2的许多有用场景(也许有......)