Java泛型问题:如何访问子类参数
嘿,我来帮你搞定这个泛型方法的问题!
问题分析与解决方案
先把你给出的原始代码整理清楚:
父类 Building
public class Building { private String name; private int noOfHouses; }
子类 House
public class House extends Building { private String houseNumber; }
你尝试编写的泛型方法:
public <T> void construct(T a){ System.out.println(a.getHouseNumber()); }
问题出在哪?
这段代码会直接编译报错:一是泛型参数T没有任何约束,编译器完全不知道T类型的对象拥有getHouseNumber()方法;二是House类里的houseNumber是私有字段,就算类型匹配,外部也无法直接访问它。
分步解决方案
给
House类添加公共访问方法
私有字段必须通过公共getter方法才能被外部访问,先给House补充getter(可选加setter):public class House extends Building { private String houseNumber; // 公共getter方法,用于获取houseNumber public String getHouseNumber() { return houseNumber; } // 可选:如果需要设置字段,添加setter public void setHouseNumber(String houseNumber) { this.houseNumber = houseNumber; } }给泛型参数添加边界约束
修改泛型方法,指定T必须是House或其子类,这样编译器就能确定T的实例一定拥有getHouseNumber()方法:// 限定泛型T为House及其子类 public <T extends House> void construct(T a){ System.out.println(a.getHouseNumber()); }
扩展:适配更多子类的方案
如果以后有其他继承Building的子类也需要类似的方法,可以定义一个通用接口,让需要的子类实现它:
// 定义统一的接口 public interface HasHouseNumber { String getHouseNumber(); } // 让House实现该接口 public class House extends Building implements HasHouseNumber { private String houseNumber; @Override public String getHouseNumber() { return houseNumber; } }
此时泛型方法可以约束为这个接口,适用性更强:
public <T extends HasHouseNumber> void construct(T a){ System.out.println(a.getHouseNumber()); }
这样不管是House还是其他实现了HasHouseNumber的类,都能被这个方法处理啦。
内容的提问来源于stack exchange,提问作者Vank
相关产品推荐
相关产品推荐

