2012-12-02 54 views
3

我想传递一个枚举到一个方法,迭代该枚举值,并调用该枚举在所有这些值上实现的方法。我收到了“value.getAlias()”部分的编译器错误。它说“方法getAlias()对于E类型是未定义的”我试图说明E实现了HasAlias接口,但它似乎不起作用。这是可能的,如果是这样,我如何修复下面的代码来做我想要的?下面的代码只是为了展示我的过程,我不打算在枚举中打印值的名称,而是展示我的问题。如何在Java中调用通用枚举的实现方法?

public interface HasAlias{ String getAlias(); }; 

public enum Letters implements HasAlias 
{ 
    A("The letter A"), 
    B("The letter B"); 

    private final String alias; 

    public String getAlias(){return alias;} 

    public Letters(String alias) 
    { 
    this.alias = alias; 
    } 

} 

public enum Numbers implements HasAlias 
{ 
    ONE("The number one"), 
    TWO("The number two"); 

    private final String alias; 

    public String getAlias(){return alias;} 

    public Letters(String alias) 
    { 
    this.alias = alias; 
    } 

} 

public class Identifier 
{ 
    public <E extends Enum<? extends HasAlias>> void identify(Class<E> enumClass) 
    { 
     for(E value : enumClass.getEnumConstants()) 
     { 
     System.out.println(value.getAlias()); 
     } 
    } 
} 

回答

4

这里是你如何绑定一个类型的枚举实现HasAlias:

<E extends Enum<E> & HasAlias> 

一旦你做出改变。因此,其余的将正常工作。

+0

+1:精确度很高,我注意到“&” – Aubin

+0

我喜欢这个答案和Aubin提供的答案,但是这个参数看起来更加明确。你们中的任何一个对你的哪种方法更好有评论? –

+1

这个答案表达你的意图。我曾经在生产代码中使用过这个代码,我希望团队使用enum来保持一致性(因为它似乎也是你的意图),因此代码完成将为具体类型类的用户提供该类方法可用的选项列表,枚举被用于某些方法的参数。 – Bohemian

0

是的,你必须在接口中声明你的函数。为了成为一个接口,它必须包含抽象类,即没有定义的函数。

所以在这里你忘记了正确地声明你的功能。

String getAlias(); 
+0

我看过界面和方法(不是“函数”),不是吗? – Aubin

2

以下代码编译并运行良好,因为getEnumConstants()在Class上定义。无需说这个类是Enum的类。

public class EnumExtended { 

    static interface HasAlias{ String getAlias(); } 

    static class Identifier { 
     static void identify(Class<? extends HasAlias> enumClass) { 
     for(HasAlias value : enumClass.getEnumConstants()) { 
      System.out.println(value.getAlias()); 
     } 
     } 
    } 

    public static void main(String[] args) { 
     Identifier.identify(Letters.class); 
     Identifier.identify(Numbers.class); 
    } 

    static enum Letters implements HasAlias { 
     A("The letter A"), 
     B("The letter B"); 

     private final String alias; 

     @Override 
     public String getAlias(){return alias;} 

     Letters(String alias1) { 
     this.alias = alias1; 
     } 
    } 

    static enum Numbers implements HasAlias { 
     ONE("The number one"), 
     TWO("The number two"); 

     private final String alias; 

     @Override public String getAlias(){return alias;} 

     Numbers(String alias1) { 
     this.alias = alias1; 
     } 
    } 
} 
1

I found the answer in this other post

通过参考上面的帖子,我能我的代码更改为以下,使其工作:

public <E extends Enum<?> & HasAlias> void identify(Class<E> enumClass) 
{ 
    for(E value : enumClass.getEnumConstants()) 
    { 
    System.out.println(value.getAlias()); 
    } 
} 
+0

自从getEnumConstants()在Class上定义以来,我发布了一个最简单的解决方案。 – Aubin