【问题标题】:Inheritance and Generics in JavaJava中的继承和泛型
【发布时间】:2021-12-25 01:46:25
【问题描述】:

所以我正在做一个项目,我有一些关于继承的问题。 我有两个类,名为 Attribute 和 NumericalAttribute。第一个:

public class Attribute {
    Attribute() {}
    Attribute(String type) {}
}

(这应该是抽象的,但我需要实例化它,所以它不能)

还有一个:

public class NumericalAttribute extends Attribute {
    double value;

    NumericalAttribute(String value) { this.value = Double.parseDouble(value); }

    public double getAtr(Attribute atr) { return this.value; }
}

我有多个 Attribute 子级,每个子级都具有相同的结构,但代表另一种类型(字符串、整数、布尔值)。问题是我需要某种方法来返回“值”变量(我在 NumericalAttribute 中确实有)但是对于属性类。但是我不能在 Attribute 中创建方法,因为每个儿子都会有不同类型的返回。那么有什么办法可以让我通过Attribute获取“value”变量呢? 非常感谢!

  public static Atributo transformAtributo(String tipo, String valor) {
        Atributo atr = new Atributo();
        if (tipo.equals("bool")) atr = new AtributoBoolean(valor);
        else if (tipo.equals("string")) atr = new AtributoCategorico(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;

        return atr;
    }

【问题讨论】:

    标签: java generics inheritance


    【解决方案1】:

    这就是你要找的东西:

    public abstract class Attribute<T> {
    
        public abstract T getValue(Attribute attr);
    
    }
    
    public class NumericalAttribute extends Attribute<Double> {
    
        double value;
    
        @Override
        public Double getValue(Attribute attr) {
            return value;
        }
    }
    
    public class TextAttribute extends Attribute<String> {
    
        String value;
    
        @Override
        public String getValue(Attribute attr) {
            return value;
        }
    }
    

    Attribute&lt;T&gt; 是一个泛型类。返回类型在每个具体类上声明。

    【讨论】:

    • 我明白了,但我得到一个错误,说我需要在属性中添加一个返回语句
    • @Pau Attribute 应该是一个抽象类。 Attribute 的值是什么类型?
    • 对不起,我没有看到它是抽象的。我还有其他方法可以做到吗?因为我需要实例化 Attribute 类。程序是这样的:我从一个 csv 文件中读取多个字符串,并且我有一个包含每个单词类型的并行 csv 文件。然后,我要做的是实例化一个 Attribute 类(可以是 string,int,double,...),然后我根据类型链接它
    • 我在原段落中添加了代码(抱歉是西班牙语),由于现在类是抽象的,我无法实例化属性类,我真的不知道如何更改现在
    • 哦,没关系,它对我所做的改变有效。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多