假设您有以下变量:

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;,它将起作用,因为AssetKeyAssetKey的子类型,因此Class<AssetKey>Class<? extends AssetKey>的子类型。

10-01 07:59