Вы не можете использовать дженерики с перечислениями, потому что сами константы перечисления уже являются конкретными (одноэлементными) экземплярами.На уровне экземпляра дженерики уже должны быть конкретными.
Итак, я бы настоятельно рекомендовал использовать одну из альтернатив, приведенных в других ответах.
Если вы должны сделать это в перечислении, вы могли бы рассмотретьследующее, которое по крайней мере дает вам средство проверки типов во время выполнения, включая ClassCastExceptions.Вы не получите никакой поддержки от компилятора.
public enum TestEnum {
Test1(Float.class),
Test2(Integer.class),
Test3(String.class);
private final Class<?> iInputType;
private TestEnum(final Class<?> pInputType) {
iInputType = pInputType;
}
public Class<?> getInputType() {
return iInputType;
}
public String stringify(final Object pInput) {
return String.valueOf(iInputType.cast(pInput));
}
}
Тестовый код:
System.out.println(TestEnum.Test1.stringify(1.23f));
System.out.println(TestEnum.Test2.stringify(42));
System.out.println(TestEnum.Test3.stringify("foo"));
// but:
// System.out.println(TestEnum.Test1.stringify("foo")); // -> ClassCastException!
for (TestEnum test : TestEnum.values()) {
for (Object input : new Object[]{1.23f, 42, "foo"}) {
if (test.getInputType().isAssignableFrom(input.getClass())) {
System.out.println(test.stringify(input));
}
}
}