3

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

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

4 回答 4

4

以下是将类型绑定到实现 HasAlias 的枚举的方法:

<E extends Enum<E> & HasAlias>

一旦你做出这样的改变,剩下的就可以了。

于 2012-12-02T23:01:49.350 回答
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;
      }
   }
}
于 2012-12-02T23:00:41.473 回答
1

我在另一篇文章中找到了答案

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

public <E extends Enum<?> & HasAlias> void identify(Class<E> enumClass)
{
    for(E value : enumClass.getEnumConstants())
    {
     System.out.println(value.getAlias());
    }
}
于 2012-12-02T23:00:58.663 回答
0

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

所以在这里你忘记了正确声明你的函数。

 String getAlias();
于 2012-12-02T22:56:11.983 回答