Ковариантные возвращаемые типы Java не работают для переопределяющих методов экземпляра enum? - PullRequest
5 голосов
/ 07 января 2011

Я потратил довольно много времени в 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). Очевидно, компилятор смотрит только на базовое определение метода, а не на метод переопределения. С другим определением перечисления у меня был базовый метод, но он все еще не работал.

Я думаю, что с преобразованием перечислений во время процесса компиляции сложно что-то сделать, что мешает им работать, но я хочу быть уверен, что это не просто глупость.

Обратите внимание, что этот тестовый пример, по общему признанию, очень надуманный, в моем фактическом перечислении эта функциональность была бы более полезной. Я могу опубликовать его в случае необходимости.

1 Ответ

2 голосов
/ 07 января 2011

Тип CovariantEnum.INT_INSTANCE равен CovariantEnum, который возвращает Object из getData.

К сожалению, вы не можете сделать тип enum универсальным.

...