假设你有这个变量:
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> {
// ...
}
答案 0 :(得分:1)
答案 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;