返回具有上限的通用List

时间:2017-07-01 09:02:59

标签: java generics

我的问题是这篇文章的扩展。

如果我有这样的方法:

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);        
}

1 个答案:

答案 0 :(得分:0)

代码有效,因为Vecnew不是互斥的边界; <? 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); } } 的超级。