«Приведение должно быть разрешено в любом месте, где есть возможность правильного соответствия типов». В этом случае НЕТ возможности правильного соответствия типов.
Объект никогда не может быть экземпляром как List<A>
, так и List<B>
, если A и B являются конкретными, а не одинаковыми, даже если A является подтипом B или чем-то еще. Например, у вас не может быть объекта, который является List<String>
и List<Object>
. Существует (концептуально) определенный параметр типа для каждого объекта. Вы должны сначала понять эту часть.
Ваш пример точно такой же - List<Pair<F, S>>
и List<Pair<?, ?>>
. По той же причине, что и в случае String и Object, объект типа List<Pair<?, ?>>
никогда не может быть List<Pair<F, S>>
.
.
Обновление: дополнительные пояснения на случай, если это поможет. @Konstantin: Если вы напишите Pair<?, ?>
, то параметры типа на верхнем уровне, которые являются ?
(подстановочные знаки), являются гибкими. Pair<T1, T2>
совместим с Pair<?, ?>
. Однако в List<Pair<?, ?>>
, ?
не на верхнем уровне. Параметр типа на верхнем уровне - Pair<?, ?>
, который не является подстановочным знаком и поэтому не является гибким. Неважно, что у вас есть ?
глубже вниз. Если у вас есть List<? extends Pair<?, ?>>
, то верхний уровень является групповым символом и является гибким.
То, что вы, вероятно, хотите, это List<? extends Pair<?, ?>>
. Возможно, это поможет вам рассмотреть разницу между List<Pair<?, ?>>
и List<? extends Pair<?, ?>>
. List<Pair<?, ?>>
говорит, что это список, и его тип параметра точно тип Pair<?, ?>
(и ничего больше, не Pair<T1, T2>
и т. Д.). List<? extends Pair<?, ?>>
говорит, что это List, а параметр его типа является подтипом Pair<?, ?>
(и включает в себя Pair<T1, T2>
).