我有一个实用程序类需要处理泛型类,但必须限制为枚举并实现特定接口的那些。
// These two work
Class<? extends Enum<?>> enumClass;
Class<? extends MyInterface> interfaceClass;
// This is what I want but does not work
Class<? extends MyInterface & Enum<?>> enumAndInterfaceClass;
对于泛型,我可以成功使用此
public class MyClass<T extends Enum<T> & MyInterface> {
public MyClass(Class<T> theClass) {
...
}
}
但是我无法在任何地方使用泛型,需要单独声明它。我不确定这是否可行。
所以我的问题归结为如何用这些约束声明成员变量?
所以目前MyClass是一个单例,然后根据需要可以更新枚举/接口。其操作的返回值将根据给出的枚举而改变。我想不要使用泛型,因为这需要为枚举的每次更改创建一个新实例。已经有很多代码使用它,所以偏离单例不会被批准。因此必须保留参考。我想我只能强制执行接口要求,然后在setter方法中检查它是枚举抛出异常,但这并不理想。
修改(更新了问题并添加了更多详细信息)
答案 0 :(得分:2)
这应该有效:
public interface MyInterface {
void foo();
}
public final class Utils {
public static <E extends Enum<E> & MyInterface> void doWork(Class<E> clazz) {
for(E enumConstant : clazz.getEnumConstants) {
enumConstant.foo();
}
}
}
编辑我没有注意到关于将捕获的类型用作局部变量的行。您当然可以在参数化方法的整个主体中使用它,请参阅上面的修订片段。
答案 1 :(得分:2)
据我记忆,您只能为类和方法的类型参数声明交集类型(这是&
创建的内容)。您不能直接声明具有交集类型的局部变量;你可以借助类或方法类型参数创建这样的变量,如milkplusvellocet的答案所示。
在此答案中查看类似问题的JLS参考: https://stackoverflow.com/a/6643378/282229