当前位置: 首页 > 知识库问答 >
问题:

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

孟彦
2023-03-14

我第一次在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){}

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

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

我正在读Oracle的文档,它说我必须把类作为第一个参数,但是Aa,Bb和Cc都是接口。对我的英语也感到抱歉。

共有2个答案

朱锐
2023-03-14

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

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

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

修复以下参数注释后进行编辑

姬昀
2023-03-14

重要的是顺序(§4.6):

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

genericbick擦除为Aa,或Cc,具体取决于绑定中最先出现的(即最左边)。

另请参阅类型擦除教程和类型擦除,何时和发生什么

 类似资料:
  • 我有以下代码,但它不起作用:出现。 我还有这个代码: 这是可行的。在第一种情况下,是,就像在第二种情况下是。那么为什么第一种情况会导致错误,而第二种情况会成功编译? 编辑:我应该怎么做才能实现方法重载,而不引发错误?

  • 我在Java中有两个几乎相同的方法。唯一的区别是它们有不同的参数类型。它们使用泛型并返回输入参数的类型T。我怎样才能摆脱重复的代码?下面是我的两个方法。最后,它们都使用不同的类型调用Spring。否则,方法是相同的。

  • 问题内容: 为什么在同一个类中使用以下两种方法是不合法的? 我得到了 方法add(Set)与类型Test中的另一个方法具有相同的擦除add(Set)。 虽然我可以解决它,但我想知道为什么javac不喜欢这样。 我可以看到,在很多情况下,这两种方法的逻辑非常相似,可以用一个方法代替 方法,但并非总是如此。 如果你想让两个带有这些参数,这会特别令人讨厌,因为那样你就不能只更改其中一个的名称。 问题答案

  • 问题内容: 我有超一流的Foo。还有一个扩展它的类Bar。 在Foo中的功能: 酒吧功能: 出现错误: 我究竟做错了什么? 问题答案: 您正在使用不兼容的类型覆盖该方法。也许您想做类似的事情: 功能在 和功能在酒吧:

  • 问题内容: 我们可以创建相同的GET URI,但使用不同的查询参数吗? 例如,我有两个REST GET URI: 现在,REST服务无法将两个GET方法识别为单独的,而仅将其声明为第一个GET方法。 为什么会这样呢? 有什么办法可以使两个具有不同查询参数的GET方法? 如果您可以引用任何资源,将不胜感激。 问题答案: 因为 资源 是由其 PATH 唯一标识的,而不是由其参数唯一标识的。您定义的两个

  • 问题内容: 我是从Joshua Bloch的google I / O困惑者演讲中得到的。这是代码 这个main方法会引发异常,因为它是原始类型,因此in中的所有泛型都将被删除,因此最终调用而不是。 我的问题是,即使我打电话是不是应该把它调用的方法,因为由于类型擦除,这种方法是有效的并且是类型的不是? 问题答案: 被调用的方法是在编译时定义的,而不是在运行时定义的。 如果在构造函数调用中添加参数,则