Java中如何使用Class参数配合instanceof模式匹配返回对应类型实例
报错原因
instanceof模式匹配的语法规则要求,运算符右侧必须是编译期可确定的具体类型,不支持传入Class类型的变量作为匹配类型。你代码里的cls是方法运行时才传入的参数,无法在编译阶段被识别为确定类型,因此会触发编译错误。
实现方案
不需要强行套用instanceof模式匹配,通过泛型绑定入参类型和返回值类型,配合Class类自带的安全转换方法,即可实现调用侧无需手动强转的效果,同时还能修复原代码遍历删除的隐患。
修正后的完整代码:
public <T extends Storable> T get(Class<T> cls) { Iterator<Storable> it = inventory.iterator(); while (it.hasNext()) { Storable storable = it.next(); if (cls.isInstance(storable)) { it.remove(); return cls.cast(storable); } } return null; }
改动说明
- 给方法增加泛型声明
<T extends Storable>,将入参Class<T>和返回值类型T绑定,编译器会根据你传入的Class对象自动推断返回值类型 - 用
cls.cast(storable)做类型转换,这是JDK提供的安全类型转换方法,逻辑和手动强转一致,但可以和泛型返回值完美适配 - 把原for-each循环改为迭代器遍历执行删除,避免for-each遍历过程中直接调用集合
remove()触发ConcurrentModificationException异常
使用时直接传入对应类型的Class对象即可,不需要任何强制类型转换:
Food food = inventory.get(Food.class); Ore ore = inventory.get(Ore.class);
内容的提问来源于stack exchange,提问作者Zerak
相关产品推荐
相关产品推荐

