簡體   English   中英

從抽象類返回Java上的通用對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM