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
本文通过具体的代码示例,深入探讨了Java泛型中的通配符使用限制与灵活性,包括? extends与? super的不同场景应用,以及它们在集合操作与类型检查中的行为表现。
1060

被折叠的 条评论
为什么被折叠?



