【问题标题】:Java covariant return types not working for overriding methods of an enum instance?Java协变返回类型不适用于枚举实例的覆盖方法?
【发布时间】:2011-06-05 07:31:34
【问题描述】:

我在 Google 上花了很长时间来查找有关此主题的一些信息,但与 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;
    }

}

然后像这样利用协方差:

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)。显然编译器只查看方法的基本定义,而不是覆盖方法。 使用不同的枚举定义,我有基本方法抽象,但这仍然不起作用。

我认为在编译过程中转换枚举的方式很复杂,导致它无法工作,但我想确定不仅仅是我在做一些愚蠢的事情。

请注意,这个测试用例无疑是非常人为的,在我的实际枚举中,这个功能会更有用。有需要我可以贴出来。

【问题讨论】:

    标签: java enums types return covariant


    【解决方案1】:

    CovariantEnum.INT_INSTANCE 的类型是 CovariantEnum,它从 getData 返回 Object

    很遗憾,您也不能将 enum 类型设为泛型。

    【讨论】:

    • 我明白了,谢谢你的回复。我希望该类型是实际的子类,但我想这只是一个限制,因为枚举在 Java 中实现的方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    相关资源
    最近更新 更多