При назначении переменной (Set<T>
) с универсальным типом без подстановочного знака T
назначаемому объекту должен быть ровно T
в качестве универсального типа (включая все параметры универсального типа T
, подстановочный знак) и не подстановочный знак). В вашем случае T
- это Cage<Lion>
, который отличается от Cage<? extends Animal>
.
То, что вы можете сделать, потому что Cage<Lion>
присваивается Cage<? extends Animal>
, это использовать подстановочный тип:
Set<? extends Cage<? extends Animal>> a = new Set<Cage<Lion>>();