Java如何实现方法接收多类型对象列表并在内部使用对应Class类型?
解决方案
方案1:使用函数式接口做类型适配(推荐,编译期安全)
三个类虽没有共同父类/接口,但都存在getTestType方法,你可以通过泛型+函数式接口做逻辑适配,不需要写多重重载,也没有运行时风险:
首先改造testing方法:
import java.util.function.Function; public class Test { // 泛型T适配任意传入的对象类型,第二个参数传入对应类的getTestType方法引用 public <T> boolean testing(List<T> testObjs, Function<T, TestType> getTestTypeFunc) { int vals = 0; if (CollectionUtils.isNotEmpty(testObjs)) { vals += testObjs.stream() // 用传入的函数提取testType .map(getTestTypeFunc) .filter(isTestobj::isTest) .count(); } // 你原有的vals处理逻辑 return 布尔返回值; } }
调用时针对不同的类传入对应方法引用即可:
- 传入类A的列表:
testing(listOfA, A::getTestType) - 传入类B的列表:
testing(listOfB, B::getTestType) - 传入类C的列表:
testing(listOfC, C::getTestType)
如果需要在方法内部使用对象对应的Class类型,有两种实现方式:
- 直接在流处理中对单个元素调用
obj.getClass()获取运行时类 - 在方法参数中新增
Class<T> clazz入参,调用时传入对应类的Class(比如A.class),编译期即可确定类型,安全性更高。
方案2:反射调用(不推荐,运行时风险高)
如果你不想修改方法调用的参数结构,也可以用反射动态调用getTestType方法,缺点是编译期不会校验方法是否存在,后续依赖库升级如果方法名/签名变更,只有运行时才会抛出异常:
import java.lang.reflect.Method; public class Test { public boolean testing(List<Object> testObjs) { int vals = 0; if (CollectionUtils.isNotEmpty(testObjs)) { vals += testObjs.stream() .map(obj -> { try { Method getTestType = obj.getClass().getMethod("getTestType"); return (TestType) getTestType.invoke(obj); } catch (Exception e) { throw new RuntimeException("调用getTestType方法失败", e); } }) .filter(isTestobj::isTest) .count(); } // 你原有的vals处理逻辑 return 布尔返回值; } }
内容的提问来源于stack exchange,提问作者1010101
相关产品推荐
相关产品推荐

