我的问题是这篇文章的扩展。
如果我有这样的方法:
public static <E extends CharSequence, T extends E> List<T> doIt(List<E> nums) {
return null;
}
为什么这段代码会编译?为什么super String与T extends CharSequence兼容
public static void main(String[] args) {
List<CharSequence> in = new ArrayList<>();
List<? super String> result = new ArrayList<>();
result = doIt(in);
}
答案 0 :(得分:0)
代码有效,因为Vec
和new
不是互斥的边界; <? super String>
和<? extends CharSequence>
符合两者。
请注意,即使某些类符合一个约束但不符合另一个约束(例如String
CharSequence
但它不扩展Object
),它仍然有效,所以只要两个约束的交集都不为空。
相反,这不起作用:
String
因为没有符合这两个界限的类,因为CharSequence
不是import java.util.*;
class Test {
public static <E extends CharSequence, T extends E> doIt(List<E> in) {
return null;
}
public static void main(String[] args) {
final List<CharSequence> in = new ArrayList<>();
final List<? super Integer> out = doIt(in);
}
}
的超级。