Java泛型:通配符扩展类并包含该类

时间:2018-05-21 17:19:38

标签: java generics wildcard extends

假设你有这个变量:

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> {
// ...
}

3 个答案:

答案 0 :(得分:1)

Johannes Kuhn所述,答案是删除外卡以便:

Class<? extends AssetKey>.

现在我只需要知道它为什么会起作用。

答案 1 :(得分:1)

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(非-generic class)被声明为AssetKey<Texture>的子类型,它是AssetKey<?>的子类型。

如果您删除通配符,并将其声明为Class<? extends AssetKey> assetKeyClass;,它将起作用,因为AssetKey 的子类型为AssetKey,因此{{ 1}}是Class<AssetKey>的子类型。

答案 2 :(得分:0)

使用扩展

Class<? extends AssetKey> assetKeyClass;

// Subclass
assetKeyClass = TextureKey.class;
// Class
assetKeyClass = AssetKey.class;

使用 super

Class<? super TextureKey> assetKeyClass ;

// Subclass
assetKeyClass = TextureKey.class;
// Class
assetKeyClass = AssetKey.class;