我知道不可能在Enums中使用泛型,但是我正在寻找一种方法来实现具有不同返回类型的枚举的方法。
例如我有以下枚举:
enum TestEnum {
TEST_INTEGER() {
@Override
public Integer getValue() {
return 123;
}
},
TEST_STRING() {
@Override
public String getValue() {
return "Test";
}
};
public abstract Object getValue();
}
在这种情况下,TEST_INTEGER
和TEST_STRING
是TestEnum
的实现。
这就是为什么方法getValue()
在调用Object
时具有返回类型Integer
而不是String
或getValue()
。这意味着在每种情况下我都要投射到有关的Classtype。
有没有更好的方法来获得不同的Classtypes?
答案 0 :(得分:2)
是的,java允许“减少”返回类型(参见here)。
但在你的背景下,这在概念上没有意义!
想想
TestEnum someEnum = ...
Integer val = someEnum.getValue();
编译器应该如何知道哪个您实际分配给该值的枚举常量?
因此编译器只能理解:
Integer val = TestEnum.TEST_INTEGER.getValue();
但是,如果您只是知道它正在处理的是一些 TestEnum实例呢?
答案 1 :(得分:0)
如果使用<T> T
而不是Object,Java将执行未经检查的转换,具体取决于@Override
实现的返回类型:
public abstract <T> T getValue();
...
String s = TestEnum.TEST_STRING.getValue();
Integer i = TestEnum.TEST_INTEGER.getValue();
使用错误的“赋值”将在运行时导致ClassCastException。因此,如果实际类型不明显,有时可能会变得难以调试。