Вы используете контравариантность здесь.
По сути, вам нужен компаратор, который может сравнивать любые два элемента в списке. Если список имеет тип T
, это означает, что он должен иметь возможность сравнивать любые два элемента типа T - но если он может сравнивать любые два элемента некоторого типа X, где T является подклассом X, то это нормально тоже.
Чтобы привести мой любимый пример, если у вас есть компаратор, который может сравнивать любые две фигуры по площади, то вы могли бы четко использовать это для сравнения любых двух треугольников - так что можно отсортировать List<Triangle>
, используя AreaShapeComparator
.
Я не уверен, что вы подразумеваете под «когда я попробовал» в вашем последнем абзаце ... если вы могли бы привести короткий, но полный пример, который не работает, мы можем попытаться объяснить, почему.
РЕДАКТИРОВАТЬ: Хорошо, вы не можете использовать ? extends X
или ? extends Y
в выражении new
- вы можете использовать их только как часть объявления, либо метода, типа или переменной. Когда вы создаете новый объект, вам нужно указать точный тип.