Enum类型的Java泛型

| 我正在尝试编写Java类,其中一部分需要将未知枚举的值映射到另一个类。我的类包含一个字段
private Map<? extends Enum, Unit> myMap
,并使用工厂方法
createMyClass
进行初始化:
public static MyClass <T extends Enum> myClass createMyClass(Class<T> x) {
    MyClass theClass = new MyClass() //constructor is private
    //...
    myMap = new HashMap<T, Unit>();
    for(T t : x.getEnumConstants())
        myMap.put(t, theClass.new Unit(t));
    //...
}
Unit
类是(并且据我所知必须是)
MyClass
的内部类。当我将其放入NetBeans时,它会发出以下消息:   接口
java.util.Map<K,V>
中的方法
put
无法应用于给定类型   必需:在
? extends java.lang.Enum
,ѭ8#中捕获#4   找到:
T
MyClass.Unit
我了解(或至少我认为是这样),集合如何在使用通配符时要非常小心,以保持类型安全,但是我无法想到
T extends Enum
不能匹配match12ѭ。     
已邀请:
Map<? extends Enum, Unit>
的意思是\“键是扩展Enum的某个特定类,但我不知道哪个。\”。而且,由于您不知道它是哪个类,因此无法向此类Map添加任何内容,因此只能从中获取元素并确定它们是14 s。 您可能应该只将该字段声明为
Map<Enum, Unit>
-它将允许所有
Enum
子类都很好。 这似乎是对Java枚举的最普遍误解,因为人们普遍看到
?
通配符,并认为必须使用它来允许子类。     
尝试将方法声明更改为:
public static <T extends Enum<T>> MyClass createMyClass(Class<T> x) {
}
    
您可以阅读此泛型教程。它在第4节(通配符)中解释了为什么此方法不起作用。 据我所理解, ?扩展Enum可以是任何枚举,而不仅仅是T或T的子类。     

要回复问题请先登录注册