如果
public void foo(List<? super Integer> list){}
是有效的,
有什么问题public <T super Integer> void foo(List<T> list){}
如果不允许第二个,因为它没有意义,因为它允许任何类型被限定满足T
的约束,与第一种情况有什么不同?< / p>
答案 0 :(得分:0)
考虑首字母缩略词PECS:
Producer Extends,Consumer Super
给定一个列表,T
并不是有用的,因为你永远不能从该列表中获取一个元素(因为它是一个消费者,而不是一个生产者),例如,看看它是什么类型是:它只是一个消费者,可以安全地将Integer
传递给。
答案 1 :(得分:0)
这是其中一个问题,答案是您必须向语言设计师询问。我的猜测是,根本没有用例来证明它的合理性。
如果你努力尝试,你可以想到需要它的例子,但他们是如此做作,以至于我认为它不值得。这是我能想到的最简单的方法(我认为)没有这个功能就无法编写。
static <T super Integer> void combineAndAdd42(Set<T> set1, Set<T> set2) {
set1.add(42); // This line requires T super Integer.
set1.addAll(set2); // These 2 lines require both Sets have the
set2.addAll(set1); // same type, so it can't be done with wildcards.
}