Это похоже на C #, я только что узнал об этом пару дней назад о том, почему (трудный путь, а затем информативный способ PDC).
Предположим, Dog extends Animal
Blah<Dog>
- это , а не , то же самое, что и Blah<Animal>
, они имеют совершенно разные сигнатуры типов, хотя Dog
расширяет Animal
.
Например, предположим, что метод Blah<T>
:
T Clone();
В Blah<Dog>
это Dog Clone();
, а в Blah<Animal>
это Animal Clone();
.
Вам нужен способ отличить то, что компилятор может сказать, что Blah<Dog>
имеет тот же открытый интерфейс, что и Blah<Animal>
, и это то, что указывает <? super T>
- любой класс, используемый как T, может быть приведен к своему суперклассу с точки зрения Blah<? super T>
.
(в C # 4.0 это будет Blah<out T>
, я полагаю.)