0

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

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 声明为泛型时,我会收到原始类型警告(因为我不知道它包含的数据类型)。但问题是我需要返回值,并且返回一个对象我并不完全舒服(这只是我,但这似乎不是一个好习惯?)。

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

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

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

}

当然,我会收到 Unchecked cast 警告(我可以使用 @SuppressWarnings(“unchecked”) 避免这种情况)。

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

4

3 回答 3

2

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

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

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

于 2013-09-13T12:23:33.143 回答
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;
    }
}
于 2013-09-13T12:32:30.247 回答
0

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

不,没有。

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

于 2013-09-13T12:36:32.187 回答