- List<? extends A>
除了null,无法添加其他对象,可以通过A或Object定义向上转型来读取
public class Fanxing {
public static void main(String[] args) {
List<? extends A> extendsList = new ArrayList<>();
extendsList.add(new A1());
extendsList.add(new A());
extendsList.add(null);
A extendsA = extendsList.get(0);
Object extendsB = extendsList.get(0);
}
public static class Parent {}
public static class A extends Parent {}
public static class A1 extends A {}
public static class A2 extends A {}
}
- List<? super A>
除了null和A,无法添加其他对象,可以通过Object向上转型或强制转换来读取
package gittest.fanxing;
import java.util.ArrayList;
import java.util.List;
public class Fanxing {
public static void main(String[] args) {
List<? super A> superList = new ArrayList<>();
superList.add(new Parent());
superList.add(new Object());
superList.add(new A());
superList.add(null);
A superA = (A) superList.get(0);
Object superB = superList.get(0);
}
public static class Parent {}
public static class A extends Parent {}
public static class A1 extends A {}
public static class A2 extends A {}
}
- 泛型集合强转
只有 ? extend/super 才能被强转,强转为边界或满足边界限定条件的类型
public class Fanxing {
public static void main(String[] args) {
List<? extends Parent> extendParentlist = new ArrayList<>();
List<Parent> parentList = (List<Parent>) extendParentlist;
List<Object> extendObjectList=(List<Object>)extendParentlist;
List<? extends Object> extendObjectlist = new ArrayList<>();
parentList = (List<Parent>) extendObjectlist;
List<? super Parent> superParentList = new ArrayList<>();
parentList = (List<Parent>) superParentList;
List<Object> superObjectList=(List<Object>)superParentList;
List<Object> objectList = new ArrayList<>();
parentList = (List<Parent>) objectList;
}
public static class Parent {}
public static class A extends Parent {}
public static class A1 extends A {}
public static class A2 extends A {}
}
- 总结
- ?extends/super 泛型集合主要用在方法参数的定义上,以便更宽泛的集合入参
- ?extends/super 作为方法参数时,能传入的参数类型和强转规则一样