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

Lap*_*apo 8 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){}
Run Code Online (Sandbox Code Playgroud)

但这不是:

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){}
Run Code Online (Sandbox Code Playgroud)

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

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

我正在阅读Oracle的这篇文档,它说我必须将该类作为第一个参数,但Aa,Bb和Cc都是接口.对不起,我的英文也是.

Rad*_*def 4

重要的是顺序(\xc2\xa74.6):

\n\n
\n

类型变量 (\xc2\xa74.4) 的擦除是其最左边界的擦除。

\n
\n\n

GenericBC擦除到AaCc,具体取决于边界中第一个出现的(即最左边的)。

\n\n

另请参阅类型擦除教程类型擦除、何时以及发生什么问答,以了解类型擦除的一般说明。

\n