Java优化方法:为Dragon与Orc编写通用添加方法的泛型难题
嘿,这个泛型问题我太熟了!你遇到的核心问题就是Java泛型里的PECS原则在搞事情——List<? extends Sprite>只能用来“读”(从列表里取元素),但没法往里面加任何元素(除了null);而List<? super Sprite>只能用来“写”(往列表里加元素),但读出来的元素只能被当成Object处理,没法直接用Entity或子类的方法。所以要同时实现读写操作,通配符肯定是行不通的,得用泛型方法来解决。
完整解决方案
首先假设你的类结构是这样的:
// 父类层级:Sprite <- Entity <- Dragon/Orc public class Sprite { /* 基础精灵属性 */ } public class Entity extends Sprite { // 比如你需要用到的imageWidth相关方法 public double getImageWidth() { return 0; // 实际实现逻辑 } } public class Dragon extends Entity {} public class Orc extends Entity {}
然后写通用的添加敌人方法:
/** * 通用的敌人添加方法,支持所有Entity的子类 * @param list 要添加敌人的列表 * @param count 要添加的敌人数量 * @param enemyFactory 敌人的工厂类/构造引用,用来创建具体的敌人实例 */ public <T extends Entity> void addEnemies(List<T> list, int count, Supplier<T> enemyFactory) { for (int i = 0; i < count; i++) { // 创建具体的敌人实例(Dragon或Orc) T enemy = enemyFactory.get(); // 这里可以正常读取enemy的属性,比如你需要的imageWidth double imageWidth = enemy.getImageWidth(); // 做其他初始化操作,比如设置位置、血量等等 // 正常往列表里添加敌人,完全符合类型安全 list.add(enemy); } }
调用示例
这个方法用起来非常灵活,不管是Dragon还是Orc都能直接适配:
// 添加6只Dragon List<Dragon> dragonList = new ArrayList<>(); addEnemies(dragonList, 6, Dragon::new); // 直接用构造方法引用 // 添加6只Orc List<Orc> orcList = new ArrayList<>(); addEnemies(orcList, 6, Orc::new); // 如果需要复杂的初始化逻辑,用lambda表达式自定义 addEnemies(dragonList, 6, () -> { Dragon dragon = new Dragon(); dragon.setHealth(150); dragon.setX(50 + i * 100); // 给每个龙设置不同的X坐标 return dragon; });
方案原理
这里的类型参数T是一个具体的类型(比如调用时的Dragon或Orc),编译器完全明确List<T>里存储的对象类型,所以既可以安全地从列表中读取元素并调用Entity的方法,也可以安全地向列表中添加T类型的对象,完美解决了你之前用通配符时的两难问题。
内容的提问来源于stack exchange,提问作者Yani
相关产品推荐
相关产品推荐

