Дженерики в действии

У меня есть следующий код (Java 6):

import org.javatuples.Pair;

final SortedMap<Pair<AbstractEnum<?>, String>, AdapterObject> myMap = 
         new TreeMap<Pair<AbstractEnum<?>, String>();
myMap.put(Pair.with(SubTypeEnum.ITEM1, StringUtils.EMPTY), new AdapterObject());

AbstractEnum и SubTypeEnum просто:

public final class SubTypeEnum extends AbstractEnum<SubTypeEnum>
...
public abstract class AbstractEnum<T extends AbstractEnum<T>> implements Comparable<T>, Serializable

Теперь компилятор говорит:

The method put(Pair<AbstractEnum<?>,String>, AdapterObject) in the type Map<Pair<AbstractEnum<?>,String>,AdapterObject> is not applicable for the arguments (Pair<SubTypeEnum,String>, new AdapterObject())

Есть идеи, как я могу это исправить?

3 ответа

Решение

Измените объявление на:

final SortedMap<Pair<? extends AbstractEnum<?>, String>, AdapterObject> myMap = 
            new TreeMap<Pair<? extends AbstractEnum<?>,String>, AdapterObject>();

Я верю, что вы найдете это

final SortedMap<Pair<AbstractEnum<?>, String>, AdapterObject> myMap = 
     new TreeMap<Pair<AbstractEnum<?>, String>();

действительно должно быть это

final SortedMap<Pair<AbstractEnum<SubTypeEnum>, String>, AdapterObject> myMap = 
     new TreeMap<Pair<AbstractEnum<SubTypeEnum>, String>();

Так же, как String это подтип Object, но List<String> не является подтипом List<Object>,

SubTypeEnum это подтип AbstractEnum<SubTypeEnum>, но Pair<SubTypeEnum,String> не является подтипом Pair<AbstractEnum<SubTypeEnum>,String> или же Pair<AbstractEnum<?>,String> или же Pair<anything other than SubTypeEnum,String>

Что вы должны сделать, зависит от того, как вы планируете использовать этот тип. Если вы хотите только прочитать перечисление из пары (и никогда не вставлять его), тогда Pair<? extends AbstractEnum<?>, String> буду работать.

Другие вопросы по тегам