阐述
与<? extends myClass & myInterface>不同,这是在继承体系中指定上界
<? super myClass>这是指定下界,指定?必须是myClass的超类型或其本身。
这并不是Java的语法,而是展示编译器知道什么。
将其作为方法参数时,编译器无法知道传入的是myClass的哪个父类。所以无法传入,只能传入myClass或者其子类(毕竟用myClass引用其子类是安全的)
将其作为返回类型时,不能保证返回对象的类型,所以只能用一个Object类的对象变量是合适的。
总结
带有超类型限定的通配符允许你写人一个泛型对象,而带有子类型限定的通配符允许你读取一个泛型对象。
嵌套问题
LocalDdte 实现了 ChronoLocalDate, 而 ChronoLocalDate 拓展了Comparable<ChronoLocalDate>。 因此,LocalDate 实现的是 Comparable<ChronoLocalDate> 而不是 Comparable<LocalDate>,故
public static <T extends Comparable<T>> Pair<T> minmax(T[] a);不行。
。 在这种情况下,可以利用超类型来解决:
public static <T extends Comparable<? super T>> Pair<T> minmax(T[] a)
如何解决呢?
T必须是实现Comparable<? super T>接口的,而Comparable<? super T>的泛型参数又必须是T的超类。假定T是LocalDate,那么LocalDate必须实现Comparable<? super LocalDate>,那? super LocalDate是什么呢?可以是Comparable<ChronoLocalDate>,故这样不会报错。