«Приведение должно допускаться во всех местах, где есть возможность правильного соответствия типа». В этом случае нет возможности правильного соответствия типа.
Объект никогда не может быть экземпляром как 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<?, ?>>
говорит, что это список, а параметр типа - это подтип Pair<?, ?>
(и включает в себя Pair<T1, T2>
).
Каков ожидаемый тип возврата? – Vladimir
Вы также должны указать подпись метода - и, возможно, подпись класса (где вы указали F и S?). – home
Я добавил более полный пример. –