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