我正在嘗試創建一個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
}
}
uj5u.com熱心網友回復:
問題是列舉不能被泛型輸入,所以即使你強制轉換 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();
}
uj5u.com熱心網友回復:
為什么你認為列舉比這個更可取?
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.get()當我可以使用時為什么要打電話Fields.INTEGER?
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/363425.html
上一篇:fn的可選泛型型別引數?
