如何声明一个Class <! - ? - >对象,这是一个Enum和Java接口

时间:2012-04-05 22:41:10

标签: java generics interface enums

我有一个实用程序类需要处理泛型类,但必须限制为枚举并实现特定接口的那些。

// 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方法中检查它是枚举抛出异常,但这并不理想。

修改(更新了问题并添加了更多详细信息)

2 个答案:

答案 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