我有一个类应该接受不同的数据类型作为第二个构造函数参数:
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),而不使用类声明中的类型参数?
答案 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”))