我第一次在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都是接口。对不起我的英语。
答案 0 :(得分:4)
重要的顺序(§4.6):
类型变量(第4.4节)的擦除是其最左边界的擦除。
GenericBC
将删除Aa
或Cc
,具体取决于绑定中首先出现的内容(即最左侧)。
另请参阅type erasure tutorial和type 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){}
两个结果方法都具有相同的签名,导致您的错误
在以下评论参数修正后编辑