循环枚举类值时出现“Cannot resolve method getId in Object”错误求助
解决反射枚举类时无法调用getId()方法的问题
问题出在enumClass.getEnumConstants()返回的是Object[]类型,Stream中的元素被编译器识别为Object,而Object类并没有getId()方法,所以会报错。
解决方案1:将Class类型转换为实现MyEnumInterface的枚举类
通过强制类型转换,把Class<?>转为Class<? extends MyEnumInterface>,这样getEnumConstants()返回的数组元素类型就是MyEnumInterface,可以直接调用接口方法:
import java.util.Objects; import java.util.stream.Stream; @SuppressWarnings("unchecked") public class EnumLookupExample { public static void main(String[] args) throws ClassNotFoundException { Long id = 5L; String className = "MyEnum"; Class<? extends MyEnumInterface<Long, ?>> enumClass = (Class<? extends MyEnumInterface<Long, ?>>) Class.forName("com.example.demo.dictTask." + className); MyEnumInterface<Long, ?> result = Stream.of(enumClass.getEnumConstants()) .filter(e -> Objects.equals(e.getId(), id)) .findFirst() .orElseThrow(); } }
添加@SuppressWarnings("unchecked")可以消除编译器的未检查类型转换警告,因为我们明确知道目标类是实现了该接口的枚举。
解决方案2:在Stream中逐个转换元素类型
先判断元素是否属于MyEnumInterface类型,再进行转换,这种方式更安全,能避免潜在的类型转换异常:
import java.util.Objects; import java.util.stream.Stream; public class EnumLookupExample { public static void main(String[] args) throws ClassNotFoundException { Long id = 5L; String className = "MyEnum"; Class<?> enumClass = Class.forName("com.example.demo.dictTask." + className); MyEnumInterface<Long, ?> result = Stream.of(enumClass.getEnumConstants()) .filter(obj -> obj instanceof MyEnumInterface) .map(obj -> (MyEnumInterface<Long, ?>) obj) .filter(e -> Objects.equals(e.getId(), id)) .findFirst() .orElseThrow(); } }
两种方案的核心都是让编译器识别出元素实现了MyEnumInterface,从而可以调用getId()方法。根据你的场景选择即可,方案1更简洁,方案2更严谨。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

