簡體   English   中英

具有作為構造函數參數傳遞的通用基類的枚舉

[英]Enum with generic base class passed as contructor parameter

我正在嘗試創建一個enum其構造函數接受一個基類是泛型類的對象。

我似乎無法從enum獲取底層泛型類型,但是返回的是Object而不是T

有沒有辦法做到這一點?

abstract public class Field<T> {
    abstract public T get();
}

public class IntegerField extends Field<Integer> {
    public Integer get() {
        return 5;
    }
}

public class StringField extends Field<String> {
    public String get() {
        return "5";
    }
}

public enum Fields {
    INTEGER (new IntegerField()),
    STRING  (new StringField());

    private final Field<?> field; // <<--- I can't have Field<T>, enum's can't be generic. :( 

    <T> Fields(Field<T> field) {
        this.field = field;
    }

    public <T> T get() {
        return field.get(); // <<--- Returns Object, not T
    }
}

問題是枚舉不能被通用輸入,所以即使你(T) field.get() get call ( (T) field.get() ) 你也不會有類型安全,因為它會同意任何賦值(你可以成功編譯它實例: boolean b = Fields.INTEGER.get() )。

只需使用常量:

public final class Fields {
   public static final Field<Integer> INTEGER = new IntegerField();
   public static final Field<String> STRING = new StringField();
}

為什么你認為枚舉比這個更可取?

public final class Fields {
    public static final Field<Integer> INTEGER = new IntegerField();
    public static final Field<String> STRING = new StringField();

    //private ctor
}

或者如果你喜歡

public final class Fields {
    public static Field<Integer> integerField() {
        return new IntegerField();
    }
    
    public static Field<String> stringField() {
        return new StringField();
    }

    //private ctor
}

當我只能使用Fields.INTEGER時,為什么要調用Fields.INTEGER.get()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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