我试图了解在Java中使用<? super T>
在泛型中的目的是什么。我已经阅读了很多,但还没有理解它。显然对我来说使用<T extends SomeClass>
,如果类是SomeClass或SomeClass的子类,我们现在不需要确切类型的子类,我们只知道它有超类SomeClass
的方法,所以我们可以调用像T.someMethod();
这样的方法这是非常强大的功能。但我无法理解使用<T super SomeClass>
的目的。
我们写了这样的通配符有什么特权? T是SomeClass的超类,所以Super类可能没有SomeClass的方法,我们只能确保SomeClass的超类具有Object的所有方法,所以这变得无用,那么使用它的目的是什么?
答案 0 :(得分:1)
您可以使用? super T
表达下限通配符。假设您要开发一个可以将Double放入列表的方法。
public void foo(List<Double> d) {}
但是如果你可以声明这个方法就像
那样public void foo(List<? super Double> d) {}
然后您可以传递List<Double>
,List<Number>, and List<Object>
。因此,您获得了更多的灵活性和可重用性。查看? super T
的另一种方法是通过 PUT原则
仅在将值放入结构时使用超级通配符。