假设您有以下变量:
Class<? extends AssetKey<?>> assetKeyClass;
然后,我只能将
assetKeyClass
设置为AssetKey
的子类类型。有没有办法做到这一点,再加上AssetKey
类类型本身呢?像这样 :
// Subclass
assetKeyClass = TextureKey.class;
// Class
assetKeyClass = AssetKey.class;
编辑:
忘了显示一些类代码:
public class AssetKey<T> {
// ...
}
public class TextureKey extends AssetKey<Texture> {
// ...
}
最佳答案
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>
的子类型。