【问题标题】:Java: How can I pass a value representing an Enum class?Java:如何传递表示 Enum 类的值?
【发布时间】:2012-10-31 02:36:55
【问题描述】:

动机:我想构建一个枚举来代表某些值族的所有可能值(我在这里犹豫说“类”)。枚举将有额外的方法、字段,甚至可能实现其他接口。然后我想将此枚举传递给另一个方法,它将遍历所有可能的值(使用Enum.values() 并做一些工作。

我研究发现枚举Foo实际上变成了Foo extends Enum<Foo>。这就是为什么我不能扩展枚举。我试图将我的方法参数定义为:

myMethod(Class<?> bar) {...}
myMethod(Class<? extends Enum> bar) {...}
myMethod(Class<? extends Enum<?>> bar) {...}

但是当我尝试一些基本的东西时在方法内部:

int i = bar.values().length;

它失败了。有没有其他方法可以做到这一点(或避免这样做)?

注意:我可以传递枚举的实际实例并使用bar.getDeclaringClass() 来查找枚举类(而不是实例),但这很丑。

【问题讨论】:

  • 听起来你真的在描述一个“迭代器”。
  • @HotLicks 也许但 OP 正在寻找更多。 Java 枚举可以很好地作为多吨的逻辑宇宙。

标签: java class generics enums


【解决方案1】:

尝试使用以下方法:

<E extends Enum<E>> void myMethod(Class<E> enumType) {
    E[] values = enumType.getEnumConstants();
    ...
}

来自getEnumConstants() 文档:

返回此枚举类的元素,如果此 Class 对象返回 null 不代表枚举类型。

编辑:如果您使用不同的枚举类型来实现共享接口,您可以修改您的方法以便能够调用接口方法。例如:

interface Fooable {
    void foo();
}

...

<E extends Enum<E> & Fooable> void myMethod(Class<E> enumType) {
    E[] values = enumType.getEnumConstants();
    for (E value : values) {
        value.foo();
    }
}

【讨论】:

  • +1 获得通用方法教程和使用“&”的奖励。我确实计划使用枚举类型来实现其他接口。 OP 的关键是使用 getEnumConstants() 而不是 values()。我采取了我以前的尝试,并用前者代替了后者,这也奏效了。为什么 values() 不起作用? (谢谢)
  • 基本上values() 是为任何enum 类型自动声明的静态方法。但是bar(或者在我的例子中是enumType)本身并不是一个类型——它是一个代表一个类型的对象,你只能在其上调用像getEnumConstants()这样的实例方法。
  • 这是有道理的。是否有任何东西(可能在反射包中)允许构造一个可以代表实际类定义的对象?类似的东西:MagicType 代表; standin.makeClassFromMagicType(classArg).someStaticMethod();
  • 据我所知,这是不可能的——静态方法不能像那样“代理”,因为它们没有接口。例如,该语法将要求 makeClassFromMagicType 返回声明 someStaticMethod 的接口实例 - 但当然该方法不能是静态的。
猜你喜欢
  • 1970-01-01
  • 2022-06-14
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
  • 2015-02-06
相关资源
最近更新 更多