为什么java不允许使用带有super关键字的type参数?

时间:2015-10-04 16:28:01

标签: java generics

如果

public void foo(List<? super Integer> list){}

是有效的,

有什么问题
public <T super Integer> void foo(List<T> list){}

如果不允许第二个,因为它没有意义,因为它允许任何类型被限定满足T的约束,与第一种情况有什么不同?< / p>

2 个答案:

答案 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.
}