例如,在使用通用比较器时使用它 - Comparator<? super T> c
我理解它基本上意味着比较器将比较T及其超类,但我不理解它背后的逻辑。
为什么不使用“? extends T
”?
或者,例如,我发现了一个类似问题的人问过“List<? super Number>
” - 是否意味着该列表将接收Number对象及其超类?但是Number的超类是Object,这是否意味着列表可以接收任何对象?
答案 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
Integer
和Double
都延伸Number
。它们是Number
的子类。因此可以将它们添加到数字列表中。
Number
是Object
的子类。如果查看源代码,它不会显式扩展任何内容(尽管它实现了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
。