Java枚举方法返回构造函数中提供的泛型类型?

时间:2018-05-26 11:29:53

标签: java generics enums

我想为枚举方法getValue()设置泛型返回类型。返回的类型应与枚举的构造函数中提供的类型相同。

public enum ParameterType
{
    NUMBER(int.class),
    TEXT(String.class);

    private Class<?> classType;

    ParameterType(Class<?> _clazz)
    {
        classType = _clazz;
    }

    public <T> T getValue()
    {
        String a = "i am a text";
        int b = 42;

        return classType.cast(a);
        //return classType.cast(b);
    }
}

但是,在这种情况下,错误是“无法从捕获#3?转换为T”。此外,无法在枚举本身上提供通用的“X”类型,可以在类的情况下用于返回类型。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

忘记施法。为每个枚举常量重新定义'getValue()'。

答案 1 :(得分:0)

您无法使用枚举执行此操作,因为枚举中的所有值都具有相同的类型。

要做到这一点,你必须手工建立“枚举”:

public final class ParameterType<T>
{
  public static final ParameterType<Integer> NUMBER = new ParameterType<>(42);
  public static final ParameterType<String> TEXT = new ParameterType<>("I am a text");

  private ParameterType(T value) {
    this.value = value;
  }

  public T getValue() { return value; }
}

重要的一点是使构造函数私有,因此不能在类外部调用它。这使得它有点像枚举,因为您定义的实例是唯一的实例。