我想用Java强制实现枚举,但我发现我无法做到。 所以我决定定义一个返回子类枚举的抽象函数。但不知道该怎么做。
以下是代码:
EnumInterface
public interface EnumInterface
{
public String getString();
}
父类
public abstract class ParentClass {
public abstract Enum<?> getEnums();
}
ChildClass
public class ChildClass extends ParentClass{
public enum EnumImplementation implements EnumInterface
{
FOO("foo"),
BAR("bar");
String string;
EnumImplementation(String field)
{
this.string = string;
}
@Override
public String getString() {
return string;
}
}
@Override
public Enum<?> getEnums() {
return ?;
}
}
上面的代码不起作用,我只是想描述我的问题。
如果可能的话,我还想强制将枚举返回类型强制为EnumInterface
。
如果您知道如何强制执行特定的枚举实现,那将更好,因为我甚至不必在ParentClass
中定义该函数。
那么,我如何返回枚举,以便我可以执行此操作instanceOfParentClass.getEnums().FOO
?
答案 0 :(得分:1)
这个怎么样:
public <T extends Enum<T> & EnumInterface> T[] getEnums() {
return (T[])EnumImplementation.values();
}
注意演员表,这可能会导致ClassCastException
。
为了防止这种情况,您可以传递枚举类或只返回EnumInterface
:
public <T extends Enum<T> & EnumInterface> T[] getEnums(Class<T> enumType)
public <T extends Enum<T> & EnumInterface> EnumInterface[] getEnums()
请注意,这不会让您调用类似getEnums().FOO
的方法,但您可以传递类和名称,例如
public <T extends Enum<T> & EnumInterface> T[] getEnum(Class<T> enumType, String enumName) {
return Enum.valueOf( enumType, enumName);
}
然而,正如蒂姆B所说,对于你想要实现的目标,可能有更好的选择。
答案 1 :(得分:0)
试试这个。
<强> EnumInterface 强>
public interface EnumInterface {
public String getString();
}
<强>父类强>
public abstract class ParentClass<ENUM_TYPE extends Enum<ENUM_TYPE> & EnumInterface> {
public abstract ENUM_TYPE getEnums();
}
<强> ChildClass 强>
public class ChildClass extends ParentClass<ChildClass.EnumImplementation> {
public static enum EnumImplementation implements EnumInterface {
FOO("foo"),
BAR("bar");
String string;
EnumImplementation(String field) {
this.string = field;
}
@Override
public String getString() {
return string;
}
}
public EnumImplementation getEnums() {
return EnumImplementation.values()[0];
}
public static void test() {
Object result = new ChildClass().getEnums().FOO;
}
}
请注意getEnums()
返回枚举值。它不可能返回枚举容器本身,但您可以从任何值调用其他枚举值(f.e. EnumImplementation.FOO.BAR.FOO
)
答案 2 :(得分:0)
为了将属性名称映射到数据库字段,您可以使用enum valueOf方法。
您需要在类中进行映射,因为您无法传递对静态枚举的引用:
http://www.tryjava8.com/app/snippets/52b86150e4b0f5090255bc45
import java.util.*;
public class Main{
static enum TestE {
FOO,
BAR
}
static class TestC {
TestE getEnum(String name) {
return TestE.valueOf(name);
}
}
public static void main(String[] args){
System.out.println(TestE.FOO);
System.out.println(new TestC().getEnum("BAR"));
}
}