从抽象类返回Java上的泛型对象

时间:2013-09-13 12:15:55

标签: java generics casting

我有一个类应该接受不同的数据类型作为第二个构造函数参数:

public abstract class QueryMatch {
String key;
Object input;

public <T> QueryMatch(String key, T o) {
    this.key = key;
    input = o;
}

public String getKey() {
    return key;
}

public Object getValue() {
    return input;
}
}

我不想使用类型参数,比如

public abstract class QueryMatch<T>{
String key;
T input;
...

通过这种方式,我在将QueryMatch声明为通用检索时获取原始类型警告(因为我不知道它包含的数据类型)。但问题是我需要返回值,并且通过返回一个Object我不是很舒服(仅仅是我,但它似乎不是一个好习惯吗?)。

此外,另一个类继承自它:

public class QueryMatchOr extends QueryMatch {
public QueryMatchOr() {
    super("title", new ArrayList<String>());
}

public void addMatch(String match) {
    ((ArrayList<String>) input).add(match);
}

}

当然我收到了一个未经检查的投射警告(我可以通过@SuppressWarnings(“未选中”)来避免)。

所以,我的问题是......有没有更好的方法来实现我想要做的事情?一个抽象类,它包含一个对象(可以是有界的),并返回它包含的数据类型(而不是Object),而不使用类声明中的类型参数?

3 个答案:

答案 0 :(得分:2)

首先,我认为最好的答案是让你的班级变得通用。但如果你真的不想这样做,你可以这样做:

public <T> T getValue(Class<T> type) {
    return (T)input;
}

在某种程度上,您需要为类的返回值提供预期的类型。这可以通过我使该类通用或方法通用来完成。

答案 1 :(得分:2)

你在做什么并不是一个好的设计。您正在使用超类中的Object类型字段,而您只能知道它在子类中的实际(所需)类型。如果您只知道子类中的那个,则在子类中声明该变量。甚至没有提到你的字段不是私密的。

怎么样:

public abstract class QueryMatch {

    private String key;

    public QueryMatch(String key) {
        this.key = key;
    }

    public String getKey() {
        return key;
    }

    public abstract void addMatch(String match);
}


public class QueryMatchOr extends QueryMatch {

    private ArrayList<String> input;

    public QueryMatchOr() {
        super("title");
        input = new ArrayList<String>();
    }

    public void addMatch(String match) {
        input.add(match);
    }
}

如果你需要超类中的getValue()方法,你真的应该把它变成通用的:

public abstract class QueryMatch<T> {

    private String key;

    public QueryMatch(String key) {
        this.key = key;
    }

    public String getKey() {
        return key;
    }

    public abstract void addMatch(String match);

    public abstract T getValue();
}


public class QueryMatchOr extends QueryMatch<ArrayList<String>> {

    private ArrayList<String> input;

    public QueryMatchOr() {
        super("title");
        input = new ArrayList<String>();
    }

    public void addMatch(String match) {
        input.add(match);
    }

    public ArrayList<String> getValue(String match) {
        input;
    }
}

答案 2 :(得分:0)

  

所以,我的问题是......有没有更好的方法来实现我想要做的事情?

不,没有。

我认为你应该使用泛型而不是@SuppressWarnings(“unchecked”))