带泛型参数的静态方法问题:实现A/B类到Data类的映射
解决无法修改A/B类时的Data通用映射问题
问题根源
你定义的泛型方法中,T仅限定为Object,编译器无法确定传入的T类型实例拥有getName()方法,因此报错。由于无法修改A和B的继承关系,可通过以下两种方案解决:
方案一:重载map方法(推荐,类型安全)
为A和B分别编写重载的静态map方法,编译器能直接识别对应类型的getName()方法,无运行时开销且类型安全:
public class DataMapper { public static Data map(A input) { Data data = new Data(); data.setName(input.getName()); return data; } public static Data map(B input) { Data data = new Data(); data.setName(input.getName()); return data; } }
调用方式和你原来的代码完全一致,编译器会自动匹配对应类型的方法。
方案二:反射调用(适配多同类场景)
如果存在大量类似A、B的类,可通过反射统一调用getName()方法,避免编写大量重载代码:
import java.lang.reflect.Method; public class DataMapper { public static Data map(Object input) { Data data = new Data(); try { // 获取getName方法并调用 Method getNameMethod = input.getClass().getMethod("getName"); String name = (String) getNameMethod.invoke(input); data.setName(name); } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { // 根据业务需求处理异常,这里抛出运行时异常示例 throw new RuntimeException("获取名称失败", e); } return data; } }
注意:反射会带来一定的性能开销,且需处理方法不存在、调用失败等异常情况。
补充:修正Data类的小问题
你提供的Data类中setName方法缺少返回类型,需补充void才能正常编译:
public class Data { private String name; public void setName(String name) { this.name = name; } }
内容的提问来源于stack exchange,提问作者markfw
相关产品推荐
相关产品推荐

