我能想到的最简单的例子是:
public static <T extends Comparable<? super T>> void sort(List<T> list) {
list.sort(null);
}
取自同一 .通过这种方式,一个可以实现,如果已经实现了,则不必做任何事情。Collections
Dog
Comparable<Animal>
Animal
Dog
编辑一个真实的例子:
在一些电子邮件乒乓球之后,我被允许从我的工作地点提出一个真实的例子(耶!
我们有一个叫做(它做什么并不重要),这个想法是积累东西。该声明非常琐碎(简化):Sink
interface Sink<T> {
void accumulate(T t);
}
显然,有一个辅助方法可以采用 a 并将其元素排出到 a(这有点复杂,但要简单一些):List
Sink
public static <T> void drainToSink(List<T> collection, Sink<T> sink) {
collection.forEach(sink::accumulate);
}
这很简单,对吧?井。。。
我可以有一个,但我想把它消耗到一个 - 这对我们来说是一个相当普遍的事情;但这将失败:List<String>
Sink<Object>
Sink<Object> sink = null;
List<String> strings = List.of("abc");
drainToSink(strings, sink);
为此,我们需要将声明更改为:
public static <T> void drainToSink(List<T> collection, Sink<? super T> sink) {
....
}