Java中如何使用多个Default List Model及解决类型转换问题
解决Character子类到对应DefaultListModel的类型转换问题
核心思路:向下转型前必须做类型检查
因为Player/Creature/NPC都是Character的子类,要把Character对象转为子类类型,必须先通过instanceof判断对象实际类型,避免抛出ClassCastException。
基础转换示例
假设你有一个Character实例,要添加到playerList:
Character character = ...; // 你的Character对象 if (character instanceof Player) { Player player = (Player) character; playerList.addElement(player); }
批量处理所有角色
如果你的角色都存在一个统一的集合里,可以循环筛选并添加到对应模型:
List<Character> allCharacters = ...; // 所有角色的数据源 for (Character c : allCharacters) { if (c instanceof Player) { playerList.addElement((Player) c); } else if (c instanceof Creature) { creatureList.addElement((Creature) c); } else if (c instanceof NPC) { npcList.addElement((NPC) c); } }
通用工具方法(可选)
可以封装一个泛型方法简化重复逻辑,不用每次写instanceof判断:
private <T extends Character> void addCharacterToModel(DefaultListModel<T> model, Character charObj) { // 检查对象是否匹配模型的泛型类型 if (model.getElementType().isInstance(charObj)) { model.addElement(model.getElementType().cast(charObj)); } }
调用方式:
addCharacterToModel(playerList, someCharacter); addCharacterToModel(creatureList, someCharacter); addCharacterToModel(npcList, someCharacter);
关于统一模型的补充
你最初尝试用DefaultListModel<Character>报错,大概率是因为对应的JList泛型不匹配(比如你的JList是JList<Player>)。如果要统一用Character类型的模型,对应的JList也得是JList<Character>,然后通过自定义单元格渲染器区分不同子类的显示样式,但当前你需要三个独立列表的场景,用三个不同泛型的模型是更合理的设计。
内容的提问来源于stack exchange,提问作者AJBarkus
相关产品推荐
相关产品推荐

