代码之家  ›  专栏  ›  技术社区  ›  Lapo pfalcon

使用有界类型参数时,“两种方法都有相同的擦除”错误

  •  8
  • Lapo pfalcon  · 技术社区  · 8 年前

    我第一次使用Java中的泛型,我正面临一个我无法克服的问题:为什么编译:

    public interface Aa{}
    public interface Bb{}
    public interface Cc{}
    
    
    public static <GenericAB extends Aa & Bb>
    void method(GenericAB myABobject1, GenericAB myABobject2){}
    
    public static <GenericAB extends Aa & Bb, GenericCA extends Cc & Aa>
    void method(GenericAB myAbobject, GenericCA myCAobject){}
    

    但这并不是:

    public interface Aa{}
    public interface Bb{}
    public interface Cc{}
    
    
    public static <GenericAB extends Aa & Bb>
    void method(GenericAB myABobject1, GenericAB myABobject2){}
    
    public static <GenericAB extends Aa & Bb, GenericAC extends Aa & Cc>
    void method(GenericAB myAbobject, GenericAC myACobject){}
    

    我得到这个错误: 两种方法都有相同的擦除 .

    如果这是一个愚蠢的问题,我很抱歉,但我不明白为什么有界类型参数声明中的接口顺序 似乎 具有重要性。 实际上,我不认为这是导致错误的顺序,但我不知道该怎么做。

    我在读书 this documentation by Oracle 它指出,我必须将类作为第一个参数,但aa、bb和cc都是接口。我的英语也很抱歉。

    2 回复  |  直到 7 年前
        1
  •  4
  •   Radiodef    8 年前

    重要的是秩序( §4.6 ):

    删除类型变量(_§4.4)是删除其最左边的界限。

    GenericBC 擦除到 Aa Cc ,取决于哪一个出现在绑定中的第一个(即最左边)。

    另请参见 type erasure tutorial type erasure, when and what happens Q&A 一般用于解释类型擦除。

        2
  •  1
  •   Michal    8 年前

    因为在运行时类型擦除之后,两个方法都具有相同的方法头

    public static <GenericAB extends Aa & Bb> void method(GenericAB myABobject1, GenericAB myABobject2){}
    

    变成

    public static void method(Aa myABobject1, Aa myABobject2){}
    

    public static <GenericAB extends Aa & Bb, GenericBC extends Aa & Cc>void method(GenericAB myAbobject, GenericBC myBCobject){}
    

    变成

    public static void method(Aa myAbobject, Aa myBCobject){}
    

    两个结果方法具有相同的签名,这会导致错误

    参数下的注释固定后编辑