-1

Рассмотрим этот пример:Отливка ограничена подстановочные к неограниченной подстановки в пределах общего типа ошибка (Х <У <? extends T>> к X <Y<?>>

private <T> void m(Class<? extends T> k, Set<Class<? extends T>> sk) { 
    Class<?> ku = k; 
    Set<Class<?>> sku = sk; // <-- Type mismatch: cannot convert from 
          //  Set<Class<? extends T>> to Set<Class<?>> 
} 

Другими словами, можно назначить Class<? extends T> к Class<?> для некоторые произвольные T но не Set<Class<? extends T>> к Set<Class<?>>.

Это, вероятно, что-то делать с некоторым ограничением на ковариационной/контрвариации, но что?

Я мог бы ввести актерский состав: Class.class::cast сделал бы это. Но есть ли способ скомбинировать компилятор с моей волей с тонким типом-фу, а не избивать его в голове с помощью броска?

+1

[вложенными подстановочные] (http://bayou.io/draft/Capturing_Wildcards.html#Nested_Wildcards) – ZhongYu

+0

@Sotirios - теперь, когда я знаю [ответа] (http://stackoverflow.com/a/ 32959018/7515790) Я вижу, что это дубликат, но тогда я этого не знал, и это не является очевидным совпадением с этим вопросом, поскольку он опускает что-либо о вложенных подстановочных знаках, что, похоже, делает его другим. – davidbak

ответ

3

Даже если Class<? extends T> является Class<?>, Set<Class<? extends T>> не Set<Class<?>>, по той же причине, что даже если Dog является Animal, List<Dog> не List<Animal>. Здесь ? extends T имеет ту же роль, что и Dog, а ? имеет ту же роль, что и Animal.

? extends перед Class, чтобы получить это, чтобы скомпилировать его правильно.

Set<? extends Class<?>> sku = sk;