首页 > 解决方案 > 具有作为构造函数参数传递的泛型基类的枚举

问题描述

我正在尝试创建一个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
    }
}

标签: javagenerics

解决方案


问题是枚举不能被一般类型化,所以即使你转换了 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();
}

推荐阅读