如何声明类<&燃气轮机;对象,即Java中的枚举和接口

如何声明类<&燃气轮机;对象,即Java中的枚举和接口,java,generics,interface,enums,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<?>>

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

// 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{
公共MyClass(类中的类){
...
}
}
但是,我不能到处使用泛型,需要单独声明它。我甚至不确定这是否可能。
因此,我的问题归结为如何使用这些约束声明成员变量

因此,当前MyClass是一个单例,然后可以根据需要更新枚举/接口。其操作的返回值将根据给定的枚举而变化。我不希望在它上面有泛型,因为这需要为枚举的每次更改创建一个新实例。已经有很多代码在使用它,所以偏离单例是不会被批准的。因此,必须保留一份参考资料。我想我只能强制执行接口要求,然后在setter方法中检查它是否是引发异常的枚举,否则这并不理想

编辑(更新问题并添加更多细节)

这应该可以:

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();
        }
    }
}
公共接口MyInterface{
void foo();
}
公共最终类UTIL{
公共静态空隙道具(类别clazz){
对于(E enumConstant:clazz.getEnumConstants){
enumConstant.foo();
}
}
}

编辑我没有注意到您关于将捕获的类型用作局部变量的行。当然,您可以在参数化方法的整个主体中使用它,请参见上面的修订片段。

据我所知,您只能为类和方法的类型参数声明交集类型(这是
&
创建的)。不能直接声明交集类型的局部变量;您可以借助类或方法类型参数创建此类变量,如MilkPlusVelocet的答案所示

请参阅本答案中对类似问题的JLS参考:

“您不能声明具有交集类型的局部变量。”这不是真的,请参阅我的答案。@milkplusvellocet它应该是“您不能直接声明具有交集类型的局部变量”,谢谢链接的问题确实有助于澄清为什么不可能。谢谢您的回答,但我认为这对我不起作用。我输入的本地变量应该是成员变量。我已经更新了我的问题。没问题,但我还是不明白你在问什么其操作的返回值将根据给定的枚举而变化。“为什么不能使用参数化的
MyClass