如何用Java泛型实现接收两类对象的通用字段赋值函数?
嘿,这个问题其实很好解决——核心是给你的泛型加上类型约束,让编译器知道传入的对象一定具备setFooter方法。你当前的代码里泛型T没有任何限制,编译器根本不知道它有这个方法,所以会报错。下面给你一步步的解决方案:
核心思路:用接口统一行为
既然A和B都有相同的setFooter方法,我们可以先定义一个接口来规范这个共同行为,再让A、B实现这个接口,最后给泛型加上这个接口作为上界约束。
第一步:定义统一接口
创建一个接口,声明setFooter方法,代表所有具备设置footer能力的类型:
public interface HasFooter { void setFooter(int fo); }
第二步:让A、B实现接口
修改你的A和B类,让它们实现HasFooter接口(因为它们本来就有对应的方法,只需要加implements声明即可,不用修改方法逻辑):
public class A implements HasFooter { int footer; @Override public void setFooter(int fo) { footer = fo; } } public class B implements HasFooter { int footer; @Override public void setFooter(int fo) { footer = fo; } }
第三步:修改D类的泛型约束
给D类的泛型T加上extends HasFooter的上界,这样编译器就知道所有传入的T类型对象都一定实现了setFooter方法:
public class D { public <T extends HasFooter> void change_footer(T generic_param, int value) { generic_param.setFooter(value); } }
第四步:测试代码(HelloWorld类)
现在你的main方法可以直接正常调用,完全不需要判断对象类型:
public class HelloWorld { public static void main(String[] args) { A a = new A(); new D().change_footer(a, 5); System.out.println("A的footer值:" + a.footer); // 输出5 B b = new B(); new D().change_footer(b, 5); System.out.println("B的footer值:" + b.footer); // 输出5 } }
补充:如果没法修改A、B类怎么办?
要是A和B是第三方类,不能修改它们的代码,那可以用反射来调用setFooter方法,但这种方式会牺牲类型安全性,性能也稍差,不推荐优先使用:
public class D { public void change_footer(Object generic_param, int value) { try { Method method = generic_param.getClass().getMethod("setFooter", int.class); method.invoke(generic_param, value); } catch (Exception e) { e.printStackTrace(); } } }
内容的提问来源于stack exchange,提问作者Sudhanshu Gaur
相关产品推荐
相关产品推荐

