Граница extends
(или super
) всегда включает саму границу.
Проблема в вашем случае состоит в том, что литерал класса, такой как AssetKey.class
, всегда имеет параметризованный тип Class
по непараметрической форме этого класса.Так что AssetKey.class
имеет тип Class<AssetKey>
.И Class<AssetKey>
не является подтипом Class<? extends AssetKey<?>>
, поскольку необработанный тип AssetKey
не является подтипом параметризованного подстановочного знака типа AssetKey<?>
.(Согласно правилам Java, необработанные и параметризованные версии типа не являются подтипами друг друга.)
С другой стороны, TextureKey.class
имеет класс Class<TextureKey>
, который равен подтип Class<? extends AssetKey<?>>
, потому что тип TextureKey
(неуниверсальный класс) объявляется как подтип AssetKey<Texture>
, который является подтипом AssetKey<?>
.
Если вы отброситеподстановочный знак, и просто объявить его как Class<? extends AssetKey> assetKeyClass;
, он будет работать, потому что AssetKey
является подтипом AssetKey
, и, таким образом, Class<AssetKey>
является подтипом Class<? extends AssetKey>
.