我花了很长时间与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)。显然,编译器只查看方法的基本定义,而不是重写方法。 使用不同的枚举定义我有基本方法摘要,但仍然没有用。
我认为这与枚举在编译过程中转换的方式有关,这使得它无法正常工作,但我想确定这不仅仅是我在做些傻事。
请注意,这个测试用例无疑是非常有用的,在我的实际枚举中,这个功能会更有用。如有必要,我可以发布。
答案 0 :(得分:2)
CovariantEnum.INT_INSTANCE
的类型为CovariantEnum
,从Object
返回getData
。
不幸的是,您无法使enum
类型成为通用。