【问题标题】:How to declare a Class<?> object such that is is an Enum AND an Interface in Java如何在 Java 中声明一个 Class<?> 对象,即枚举和接口
【发布时间】:2012-04-05 22:41:10
【问题描述】:

我有一个实用程序类,它需要在泛型类上工作,但必须限于那些是枚举并实现特定接口的工具类。

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

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

【问题讨论】:

标签: java generics interface enums


【解决方案1】:

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

请参阅此答案中对类似问题的 JLS 参考: https://stackoverflow.com/a/6643378/282229

【讨论】:

  • '您不能声明具有交集类型的局部变量。'这不是真的,看我的回答。
  • @milkplusvellocet 它应该是“你不能直接声明具有交集类型的局部变量”
  • 感谢链接的问题确实有助于澄清为什么这是不可能的。
【解决方案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();
        }
    }
}

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

【讨论】:

  • 感谢您的回答,但我认为这对我不起作用。我打错了本地应该是成员变量。我已经更新了我的问题。
  • 没问题,但我还是不明白你在问什么。 “其操作的返回值将根据给出的枚举而改变。”为什么你不能使用参数化的MyClass 来实现这一点?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
  • 1970-01-01
  • 2011-10-23
  • 2014-09-22
  • 2018-05-30
  • 2023-04-11
  • 1970-01-01
相关资源
最近更新 更多