2016-10-03 65 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),我的想法是提供一個常量的名稱和所有可能實現它的類型。它將返回實現接口的枚舉對象(我不必擔心兩個具有相同名稱的枚舉常量的可能性)。客戶端代碼將如下所示:

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

我卡在哪裏就是方法的定義。我在想沿着線的東西:

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

但是Java編譯器抱怨的types定義。它只會讓我傳遞一種獨特的類型!以下是有效的:

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可以採取擴展Enum並實現BaseInterface ALL類?

+0

用'Enum'擴展'BaesInterface'並只使用'BaseInterface'。 – 11thdimension

+0

這是可以理解的,因爲你的聲明所說的'types'將具有**單一類型'T' **的元素,其必須既是枚舉又是'BaseInterface' – biziclop

回答

3

您需要使用下面的定義:

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

<? extends T>允許編譯器推斷比您通過特定類型的更一般的類型,? extends Enum<?>T是任何常規枚舉類型,而不是一個具體的枚舉那就是T