bash
var goodData = new ArrayList<GoodData>();
goodData.add(new GoodData(1));
goodData.add(new GoodData(2));
ArrayList<? extends GoodData> wildGoodData = goodData;
wildGoodData.add(new BasicData()); // 编译报错,根本不知道是哪个子类型
wildGoodData.add(new GoodData(3)); // 编译报错,根本不知道是哪个子类型
wildGoodData.add(new VeryGoodData(3)); // 编译报错,根本不知道是哪个子类型
GoodData g = wildGoodData.get(0); //OK
ArrayList<? super GoodData> wildSuperBasicData = new ArrayList<BasicData>(); //OK
ArrayList<BasicData> bbb = wildSuperBasicData; //编译报错
wildSuperBasicData.add(new BasicData()); // 编译报错,根本不知道是哪个父类型
wildSuperBasicData.add(new GoodData(1)); //OK,类型匹配
wildSuperBasicData.add(new VeryGoodData(3)); //OK,类型匹配
BasicData b = wildSuperBasicData.get(0); //编译报错,只能用object接受
Object bb = wildSuperBasicData.get(0); //ok
var goodDataForPredicate = new ArrayList<GoodData>();
Predicate<BasicData> p = d -> d.data == 1;
goodDataForPredicate.removeIf(p); //OK
Predicate<GoodData> p1 = d -> d.data == 1;
goodDataForPredicate.removeIf(p1); //OK
Predicate<VeryGoodData> p2 = d -> d.data == 1;
goodDataForPredicate.removeIf(p2); //类型错误
VeryGoodData extends GoodData extends BasicData