2016-10-03 6 views
0

私はのようにこのインタフェースは、列挙型のカップルを実装するために使用される特定のタイプにのJava:ミキシングジェネリックと可変引数

public interface BaseInterface { 
} 

を定義して、次のインタフェースがあります。私は「

public enum First implements BaseInterface { 
    A1, B1, C1; 
} 


public enum Second implements BaseInterface { 
    A2, B2, C2; 
} 

をdはEnum.valueOf(String)のように動作する小さな再利用可能なメソッドのようになりました。これは、定数の名前と実装可能なすべての型を指定するという考え方です。インターフェイスを実装する列挙オブジェクトを返します(同じ名前を持つ2つの列挙定数の可能性について心配する必要はありません)。クライアントコードは次のようになります。

BaseInterface myConstant = parse("A1", First.class, Second.class); 

ここで私は固執しています。 Javaコンパイラはtypesの定義について不平を言うしかし

@SafeVarargs 
private final <T extends Enum<T> & BaseInterface > T parse(String name, Class<T>... types) { 
    // add code here 
} 

:私はの線に沿って何かを考えていました。私は1つのユニークなタイプを渡すことができます!

parse("A1"); 
parse("A1", First.class); 
parse("A1", First.class, First.class); 
parse("A1", First.class, First.class, First.class); 
parse("A1", Second.class); 
parse("A1", Second.class, Second.class); 

しかし、便利なバージョンではありません:以下の有効な

parse("A1", First.class, Second.class); 

は、どのように私はJavaのtypes列挙型を拡張し、BaseInterfaceを実装ALLのクラスを取ることができます教えてください?

@SafeVarargs 
private static final <T extends Enum<?> & BaseInterface> T parse(String name, Class<? extends T>... types) { 
    // add code here 
} 

<? extends T>コンパイラはあなたが合格特定のタイプよりも一般的な型を推論することを可能にし、? extends Enum<?>Tは、任意の一般的な列挙型ではなく、ある特定の列挙することができます:あなたは、次の定義を使用する必要が

+0

'BaesInterface'を' Enum'で拡張し、 'BaseInterface'だけを使用します。 – 11thdimension

+0

あなたの宣言が言っていることは、 'types'は**単一の型' T' **の要素を持ち、それはenumと 'BaseInterface'の両方でなければならないからです。 – biziclop

答えて