Java协变返回类型不适用于重写枚举实例的方法?

Sør*_*sen 5 java enums types return covariant

我花了很长时间与谷歌一起找到关于这个主题的一些信息,但是与Java枚举和协变返回类型相关的结果几乎不存在.

所以:是否可以使用带有枚举方法的协变返回类型,在枚举类中定义一个方法,然后在实例中覆盖它,如下所示:

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

然后像这样利用协方差:

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();
    }

}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,编译器对我的枚举定义很好,但是测试用例无法编译,说Object不能转换为Integer(或String).显然,编译器只查看方法的基本定义,而不是重写方法.使用不同的枚举定义我有基本方法摘要,但仍然没有用.

我认为这与枚举在编译过程中转换的方式有关,这使得它无法正常工作,但我想确定这不仅仅是我在做一些愚蠢的事情.

请注意,这个测试用例无疑是非常有用的,在我的实际枚举中,这个功能会更有用.我可以在必要时发布.

Tom*_*ine 2

的类型CovariantEnum.INT_INSTANCE是从 中CovariantEnum返回的。ObjectgetData

不幸的是,您也无法使该enum类型变得通用。