如何在Java中从自己的类中返回类的枚举?

时间:2013-12-23 09:42:20

标签: java enums

我想用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

3 个答案:

答案 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"));
   }
 }