2016-10-03 49 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