10

共通のインターフェースを拡張する列挙型のコレクションを作成しようとしているので、次のようになります。

interface Fooable
{
  void someCommonMethod();
}

enum E1 implements Fooable
{
   // some enumuerations and a definition for someCommonMethod()
}

enum E2 implements Fooable
{
   // some different enumerations and a different definition for someCommonMethod()
}

次に、変数が列挙型であり、インターフェイス実装することを強制することにより、これを他の場所で利用します。だからの線に沿って何か..

bar(Enum<? extends Fooable> fe)
{
  fe.ordinal();
  fe.someCommonMethod();
}

ただし、これまでのところ、インターフェイスを実装するものとして扱うには、feをキャストする必要があるようです。

bar(Enum<? extends Fooable> fe)
{
  fe.ordinal();
  ((Fooable)fe).someCommonMethod();
}

これは安全なはずですが...それは最適ではないようで、何かを見落としている可能性があります。もちろん、パラメータをFooableとして渡そうとすると、キャストして列挙型として処理することになります。これだけでなく、今では安全でもありません。以下を参照してください。

bar(Fooable fe)
{
  // potentially unsafe cast!
  ((Enum<?>)fe).ordinal();
  fe.someCommonMethod();
}

私が見落としているものはありますか、それとも

Enum<? extends Fooable>

私が得るのと同じくらい「良い」解決策に近いですか?

私はJavaに比較的慣れておらず、CやC ++のように使用しようとしていることに気付いているので、のこぎりではなくハンマーのように扱ったり、ばかげた単純なものを見落としたりする場合は、遠慮なく指摘してください:)

4

2 に答える 2

20

これは、TがEnumを拡張し、Fooableを実装することを意味します。

<T extends Enum<T> & Fooable>

したがって、メソッドは次のように記述できます。

<T extends Enum<T> & Fooable> void bar(T fe) {
    fe.ordinal();
    fe.someCommonMethod();
}
于 2012-08-10T21:55:44.887 に答える
1

必要なオプションの1つは、必要なEnumのメソッドをFooableに追加するか、Fooableを拡張して必要なEnumメソッドを追加する新しいインターフェイスを作成することです。

例:

interface Fooable {
   void someCommonMethod();
}

interface FooableEnum extends Fooable {
   int ordinal();
}

enum E1 implements FooableEnum {
   // Implement someCommonMethod.
   // ordinal() is already implemented by default.
}

これを実行するFooableEnumと、メソッドシグネチャのパラメータタイプとして使用でき、一般的なものについて心配する必要はありません。

于 2012-08-10T22:20:28.800 に答える