Дженерики в действии
У меня есть следующий код (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>
буду работать.