Я пытаюсь написать класс 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, он жалуется на это сообщение:
метод put
в интерфейсе java.util.Map<K,V>
не может быть применен к данным типам
обязательно: захват # 4 из ? extends java.lang.Enum
, MyClass.Unit
найдено: T
, MyClass.Unit
Я понимаю (или, по крайней мере, думаю, что понимаю), как Коллекции должны быть очень осторожны с использованием подстановочных знаков, чтобы сохранить безопасность типов,но я не могу вспомнить, как T extends Enum
не соответствует ? extends Enum
.