3

私は列挙型をメソッドに渡し、その列挙型の値を反復処理し、その列挙型がそれらのすべての値に実装するメソッドを呼び出そうとしています。「value.getAlias()」の部分でコンパイラエラーが発生します。「メソッドgetAlias()はタイプEに対して未定義です」と表示されます。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() が定義されているため、次のコードはコンパイルして正常に動作します。このクラスが 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 に答える