You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 00:57:02