gpt4 book ai didi

java - 无法使用带有方法的枚举的动态类参数实例化 EnumMap

转载 作者:行者123 更新时间:2023-12-01 04:22:44 30 4
gpt4 key购买 nike

我偶然发现 Java 中没有任何已定义方法的枚举与已定义方法的枚举之间存在奇怪的行为差异:在后一种情况下,Enum.classEnum.getClass() 实际上引用了不同的编译类,即 !Enum.class.equals(Enum.getClass());当尝试例如时,这会导致问题。使用仅在运行时指定的类实例化 EnumMap:

import java.util.EnumMap;

public class EnumMapTest {

private enum TestEnum {
FOO;
}

private enum TestEnumWithMethod {
BAR {
@Override
protected void doSomething() {
}
};

protected abstract void doSomething();
}

public static void main(String[] args) {
System.out.println(String.format("Testing enum %s...", TestEnum.class));

final Class<TestEnum> enumStaticClass = TestEnum.class;
System.out.println(String.format("EnumMap construction using static %s...", enumStaticClass));
new EnumMap<TestEnum, Object>(enumStaticClass);

final Class<TestEnum> enumDynamicClass = (Class<TestEnum>) TestEnum.FOO.getClass();
System.out.println("Are the static and dynamic classes equal? " + enumStaticClass.equals(enumDynamicClass));
System.out.println(String.format("EnumMap construction using dynamic %s...", enumDynamicClass));
new EnumMap<TestEnum, Object>(enumDynamicClass);


System.out.println(String.format("Testing enum %s...", TestEnumWithMethod.class));

final Class<TestEnumWithMethod> enumWithMethodStaticClass = TestEnumWithMethod.class;
System.out.println(String.format("EnumMap construction using static %s...", enumWithMethodStaticClass));
new EnumMap<TestEnumWithMethod, Object>(enumWithMethodStaticClass);

final Class<TestEnumWithMethod> enumWithMethodDynamicClass = (Class<TestEnumWithMethod>) TestEnumWithMethod.BAR.getClass();
System.out.println("Are the static and dynamic classes equal? " + enumWithMethodStaticClass.equals(enumWithMethodDynamicClass));
System.out.println(String.format("EnumMap construction using dynamic %s...", enumWithMethodDynamicClass));
new EnumMap<TestEnumWithMethod, Object>(enumWithMethodDynamicClass);
}
}

对应的控制台输出为:

Testing enum class EnumMapTest$TestEnum...
EnumMap construction using static class EnumMapTest$TestEnum...
Are the static and dynamic classes equal? true
EnumMap construction using dynamic class EnumMapTest$TestEnum...
Testing enum class EnumMapTest$TestEnumWithMethod...
EnumMap construction using static class EnumMapTest$TestEnumWithMethod...
Are the static and dynamic classes equal? false
EnumMap construction using dynamic class EnumMapTest$TestEnumWithMethod$1...
Exception in thread "main" java.lang.NullPointerException
at java.util.EnumMap.initialization(EnumMap.java:726)
at java.util.EnumMap.<init>(EnumMap.java:395)
at EnumMapTest.main(EnumMapTest.java:46)

为什么为枚举创建了两个带有方法的类?为什么这会在 EnumMap 实例化过程中导致问题?在编译时不知道确切的枚举类型的情况下,如何解决这个问题来创建实例?

最佳答案

存在多个类的原因是,不同的enum方法是通过为每个enum创建一个匿名内部类($1)来实现的> 值,就像您声明了一些内联 ActionListener 一样。 “解决方法”是使用实际的 enum 类 (TestEnumWithMethod),而不是该枚举值的类;如果您了解足够的信息来安全地使用 EnumMap,那么您就了解了足够的信息来使用 enum 的“ native ”类型。

关于java - 无法使用带有方法的枚举的动态类参数实例化 EnumMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18781891/

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