代码之家  ›  专栏  ›  技术社区  ›  Benoît Dubreuil

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

  •  0
  • Benoît Dubreuil  · 技术社区  · 8 年前

    假设您有这个变量:

    Class<? extends AssetKey<?>> assetKeyClass;
    

    那我只能坐了 assetKeyClass 到的子类类型 AssetKey . 有什么方法可以做到这一点,加上允许 资产键 类类型本身?

    这样地:

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

    编辑: 忘记显示一些类代码:

    public class AssetKey<T> {
    // ...
    }
    
    public class TextureKey extends AssetKey<Texture> {
    // ...
    }
    
    3 回复  |  直到 8 年前
        1
  •  1
  •   newacct    8 年前

    extends (或) super )绑定始终包括绑定本身。

    在您的例子中,问题是类文本 AssetKey.class ,始终具有类型 Class 由参数化 非参数化 那一类的形式。所以 assetkey.class.类 具有类型 Class<AssetKey> . 和 类<assetkey> 不是的子类型 Class<? extends AssetKey<?>> 因为 原始类型 AssetKey 不是通配符参数化类型的子类型 AssetKey<?> . (根据Java规则,一个类型的原始和参数化版本不是彼此的子类型。)

    另一方面, TextureKey.class 有课吗? Class<TextureKey> ,其中 的子类型 等级<?扩展assetkey<?>> ,因为类型 TextureKey (非泛型类)声明为 AssetKey<Texture> ,它是 资产键<?gt; .

    如果除去通配符,并将其声明为 Class<? extends AssetKey> assetKeyClass; ,它会起作用,因为 资产键 的子类型 资产键 ,因此 类<assetkey> 是的子类型 Class<? extends AssetKey> .

        2
  •  1
  •   Benoît Dubreuil    8 年前

    AS Johannes Kuhn 注释:答案是删除通配符,以便:

    Class<? extends AssetKey>.
    

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

        3
  •  0
  •   marekmuratow    8 年前

    与一起使用 延伸

    Class<? extends AssetKey> assetKeyClass;
    
    // Subclass
    assetKeyClass = TextureKey.class;
    // Class
    assetKeyClass = AssetKey.class;
    

    与一起使用 超级的

    Class<? super TextureKey> assetKeyClass ;
    
    // Subclass
    assetKeyClass = TextureKey.class;
    // Class
    assetKeyClass = AssetKey.class;