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

时间:2018-05-29 18:06:28

标签: java generics type-erasure

我第一次在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 个答案:

答案 0 :(得分:4)

重要的顺序(§4.6):

  

类型变量(第4.4节)的擦除是其最左边界的擦除。

GenericBC将删除AaCc,具体取决于绑定中首先出现的内容(即最左侧)。

另请参阅type erasure tutorialtype erasure, when and what happens Q&A,了解有关类型擦除的一般说明。

答案 1 :(得分:1)

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

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){}

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

在以下评论参数修正后编辑