gpt4 book ai didi

java - isEnum() 匿名内部类的不明确行为

转载 作者:搜寻专家 更新时间:2023-11-01 02:40:25 24 4
gpt4 key购买 nike

根据我的理解,Class.isEnum() 应该为使用 enum 语句声明的任何枚举值返回 true。

如果枚举是匿名声明的,则返回 false。

isEnum() 的文档说明了这一点:

"Returns true if and only if this class was declared as an enum in the source code."

这对我来说似乎有点模棱两可。

我正在寻找一种将枚举常量与其他对象区分开来的方法,因此我需要 isEnum() 为所有枚举常量返回 true,即使它们匿名覆盖了某些内容。

除此之外,还有什么方法可以识别枚举常量吗?

运行类并查看每个常量的 isEnum() 的结果。它将为每个常量打印出 isEnum() 的值。

我原以为 isEnum() 的所有常量都应返回 true。但遗憾的是,对于 isEnum(),第三个常量返回 false。

public enum EnumTest {
Alpha(3), Beta(6), Delta(4) {
@Override
public int getValue() {
return -1;
}

@Override
public String toString() {
return "Gamma";
}
},
Epsilon(9);

private int value;

EnumTest(int value) {
this.value = value;
}

public int getValue() {
return this.value;
}

public static boolean isEnumWorkaround(Class enumClass) {
while (enumClass.isAnonymousClass()) {
enumClass = enumClass.getSuperclass();
}
return enumClass.isEnum();
}

public static void main(String[] args) {
for (EnumTest thing : EnumTest.values()) {
String nameString = thing + " (" + thing.name() + ")";
System.out.println(String.format(
"%-18s isEnum = %-5b [workaround isEnum = %b]", nameString, thing
.getClass().isEnum(), isEnumWorkaround(thing.getClass())));
}
}
}

请检查并让我知道我的理解是否正确。

最佳答案

如果我的理解是正确的,Class#isEnum() 的目的不是让你检查一个类是否是一个枚举。它只是允许您反省类声明。

如评论中所述,您可以通过以下方式轻松实现您想做的事情

yourEnumValue.getClass().isAssignableFrom(Enum.class)

yourEnumValue instanceof Enum

关于java - isEnum() 匿名内部类的不明确行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34585126/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com