【问题标题】:How to call implemented method of generic enum in Java?如何在Java中调用泛型枚举的实现方法?
【发布时间】:2012-12-02 22:51:42
【问题描述】:

我正在尝试将枚举传递给方法,迭代该枚举值,然后调用该枚举在所有这些值上实现的方法。我在“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());
      }
   }
}

【问题讨论】:

    标签: java generics interface parameters enums


    【解决方案1】:

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

    <E extends Enum<E> & HasAlias>
    

    一旦你做出这样的改变,其余的都会起作用。

    【讨论】:

    • 我喜欢这个答案和 Aubin 提供的答案,但是这个答案在允许的参数方面似乎更加明确。你们中的任何一个都有关于哪种方法更好的 cmet 吗?
    • 这个答案完全表达了你的意图。我在生产代码中使用了它,我希望团队使用枚举来保持一致性(这似乎也是你的意图),这样代码完成将为具体类型类的用户提供该类方法可用的选项列表,其中枚举被用作某些方法的参数。
    • Kudos .. 对有关枚举和接口重叠的简单概念的非常干净的回答!
    【解决方案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;
          }
       }
    }
    

    【讨论】:

      【解决方案3】:

      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());
          }
      }
      

      【讨论】:

      • 我已经发布了一个最简单的解决方案,因为 getEnumConstants() 是在 Class 上定义的。
      【解决方案4】:

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

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

       String getAlias();
      

      【讨论】:

      • 我看过界面,还有方法(不是“函数”),不是你吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-29
      • 1970-01-01
      相关资源
      最近更新 更多