为什么我们在java中使用“?super T”?

时间:2016-01-16 18:19:59

标签: java generics super

例如,在使用通用比较器时使用它 - Comparator<? super T> c

我理解它基本上意味着比较器将比较T及其超类,但我不理解它背后的逻辑。 为什么不使用“? extends T”? 或者,例如,我发现了一个类似问题的人问过“List<? super Number>” - 是否意味着该列表将接收Number对象及其超类?但是Number的超类是Object,这是否意味着列表可以接收任何对象?

1 个答案:

答案 0 :(得分:-1)

这并不意味着T及其超级班级。它意味着T及其子类。 所以不,列表不能接收任何Object,它可以接收任何子类的Number。

List<? super Number> numbers = new ArrayList<>();
Integer i = 23;
Double d = 3.14;
Object o = new Object();
numbers.add(i);
numbers.add(d);
numbers.add(o); // compilation error

IntegerDouble都延伸Number。它们是Number的子类。因此可以将它们添加到数字列表中。

NumberObject的子类。如果查看源代码,它不会显式扩展任何内容(尽管它实现了Serializable)。这意味着它的超类是Object。我们无法在数字列表中添加对象。

Object o2 = 300;
numbers.add(o2);    // compilation error
numbers.add((Number) o2);   // no compilation error once we cast it

事实上,如果它是Object,我们可以添加Number。当然,所有Number都是Object s,但并非所有Object都是Number s。但是,如果它被声明为Object,那么我们首先必须将其转换为Number