Используйте следующее:
Msg extends Value>> someMsg = strMsg;
Проблема в том, что ?
в Msg
является NOT , способным преобразовать захват. Это не «f6] из Value
из типа . Это« Msg
из Value
типа ЛЮБОЙ ».
Это также объясняет, почему вместе с изменением объявления я также переименовал переменную в someMsg
. Value
не может быть просто Object
. Он должен принадлежать некоторым типу (String
в этом примере).
Рассмотрим более общий пример List
. Аналогично исходному сценарию a >
List
can NOT capture-convert a >
List
. >
List> lolInt = null;
List> lolAnything = lolInt; // DOES NOT COMPILE!!!
// a list of "lists of anything"
List extends List>> lolSomething = lolInt; // compiles fine!
// a list of "lists of something"
Вот еще один способ взглянуть на это:
Integer
- Number
, но List<
Integer
>
не является List<
Number
>
Аналогичным образом, List
может быть захвачен захватом с помощью List>
, но List<
List
>
не является List<
List>
>
List extends
Number
>
может захватывать-преобразовать a List<
Integer
>
S аналогично List extends
List>
>
может захватывать-преобразовать List<
List
>
Тот факт, что некоторые ?
могут захватить и другие, также не может объяснить следующий фрагмент:
List> lolAnything = new ArrayList>(); // compiles fine!
List> listSomething = new ArrayList>(); // DOES NOT COMPILE!!!
// cannot instantiate wildcard type with new!
List>
List animals = new ArrayList()
?
и
?