Я потратил довольно много времени в Google, чтобы найти некоторую информацию по этой теме, но результаты, относящиеся как к перечислениям Java, так и к ковариантным типам возвращаемых данных, в значительной степени отсутствовали.
Итак: возможно ли использовать ковариантные возвращаемые типы с методами enum, где вы определяете метод в классе enum, а затем переопределяете его в экземплярах, например:
package enumcovariance.test;
public enum CovariantEnum {
INT_INSTANCE(new Integer(3)) {
@Override
public Integer getData () {
return (Integer) super.getData();
}
},
STR_INSTANCE("Hello world") {
@Override
public String getData () {
return (String) super.getData();
}
};
private final Object data;
private CovariantEnum(Object data) {
this.data = data;
}
public Object getData () {
return data;
}
}
А затем воспользоваться ковариацией следующим образом:
package enumcovariance.test;
import org.junit.Test;
public class CovariantEnumTest {
@Test
public void intEnumTest () {
Integer i = CovariantEnum.INT_INSTANCE.getData();
}
@Test
public void strEnumTest() {
String s = CovariantEnum.STR_INSTANCE.getData();
}
}
В этом случае компилятор в порядке с моим определением перечисления, но тестовый пример не компилируется, говоря, что Object не может быть преобразован в Integer (или String). Очевидно, компилятор смотрит только на базовое определение метода, а не на метод переопределения.
С другим определением перечисления у меня был базовый метод, но он все еще не работал.
Я думаю, что с преобразованием перечислений во время процесса компиляции сложно что-то сделать, что мешает им работать, но я хочу быть уверен, что это не просто глупость.
Обратите внимание, что этот тестовый пример, по общему признанию, очень надуманный, в моем фактическом перечислении эта функциональность была бы более полезной. Я могу опубликовать его в случае необходимости.