Java中Inheritance与Generics应用问题:如何通过Attribute父类获取子类不同类型value
解决方案
方案1:泛型父类实现(最推荐)
通过给Attribute类定义泛型参数,既满足父类可实例化的要求,也能让各子类指定value的返回类型,实现统一的取值方法:
首先修改Attribute类代码:
public class Attribute<T> { Attribute() {} Attribute(String type) {} // 统一声明getValue方法,父类默认返回null public T getValue() { return null; } }
各子类继承时指定对应的泛型类型,以NumericalAttribute为例:
public class NumericalAttribute extends Attribute<Double> { double value; NumericalAttribute(String value) { this.value = Double.parseDouble(value); } @Override public Double getValue() { return this.value; } }
其他子类同理:字符串类型子类继承Attribute<String>、布尔类型子类继承Attribute<Boolean>即可。
使用时直接通过父类实例调用getValue()取值即可:
// 示例取值 Attribute<?> attr = transformAtributo("num", "12.5"); Double numValue = (Double) attr.getValue();
如果直接声明泛型类型的变量,还可以避免强转操作。
方案2:Object返回值实现(无泛型侵入)
如果不想引入泛型,可以直接在父类定义返回Object类型的统一取值方法,Java支持协变返回类型,子类可以直接返回对应类型的value:
修改Attribute类:
public class Attribute { Attribute() {} Attribute(String type) {} public Object getValue() { return null; } }
子类重写示例:
public class NumericalAttribute extends Attribute { double value; NumericalAttribute(String value) { this.value = Double.parseDouble(value); } @Override public Double getValue() { return this.value; } }
使用时按需做类型转换即可。
现有转换方法优化建议
你现有transformAtributo方法可以优化掉无用的父类实例初始化,同时注意统一类名拼写(你代码中同时出现了Atributo和Attribute两种拼写):
public static Attribute transformAtributo(String tipo, String valor) { Attribute atr; if (tipo.equals("bool")) { atr = new AttributeBoolean(valor); } else if (tipo.equals("string")) { atr = new AttributeCategorico(valor); } else if (tipo.equals("num")) { atr = new AtributoNumerico(valor); } else if (tipo.equals("set")) { atr = new AtributoCategoricoMultiple(valor); } else if (tipo.equals("fecha")) { atr = null; } else { // 非指定类型返回默认父类实例,匹配原有逻辑 atr = new Attribute(); } return atr; }
取值安全提示
如果不确定返回的子类类型,可配合instanceof做类型校验,避免强转报错:
Attribute attr = transformAtributo("num", "3.14"); if (attr instanceof NumericalAttribute numAttr) { double value = numAttr.getValue(); // 执行对应业务逻辑 }
内容的提问来源于stack exchange,提问作者Pau
相关产品推荐
相关产品推荐

