[英]Returning a generic object on Java from abstract class
我有一個應該接受不同數據類型作為第二個構造函數參數的類:
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);
}
}
當然,我得到了一個未選中的強制警告(可以使用@SuppressWarnings(“ unchecked”)避免它)。
所以,我的問題是...是否有更好的方法來實現我的目標? 一個抽象類,它包含一個對象(可以綁定),並返回其包含的數據類型(而不是Object),而無需在類聲明中使用類型參數?
所以首先,我認為最好的答案是使您的類通用。 但是,如果您真的不想這樣做,則可以執行以下操作:
public <T> T getValue(Class<T> type) {
return (T)input;
}
您需要以某種方式為類提供返回值的預期類型。 這可以通過使該類通用或使該方法通用來完成。
您正在做的不是一個好的設計。 您正在使用超類中的“ 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;
}
}
所以,我的問題是...是否有更好的方法來實現我的目標?
不,沒有。
我認為您應該使用泛型而不是@SuppressWarnings(“ unchecked”))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.