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

重载方法:两种方法具有相同的擦除

松翔
2023-03-14

我有以下代码,但它不起作用:错误两种方法具有相同的擦除出现。

public class Foo<V>  {
    public static void main(String[] args)  {
    }

    public void Bar(V value)  {
    }

    public void Bar(Object value)  {
    } 
}

我还有这个代码:

public class Foo<V>  {
    public static void main(String[] args)  {
    }

    public void Bar(B value)  {
    }

    public void Bar(A value)  {
    }
}

class A  {
}

class B extends A  {
}

这是可行的。在第一种情况下,V对象,就像在第二种情况下Ba。那么为什么第一种情况会导致错误,而第二种情况会成功编译?

编辑:我应该怎么做才能实现方法重载,而不引发错误?

共有2个答案

吕鸿轩
2023-03-14

V不是“Object的孩子”。V是一个无界泛型类型,它擦除为Object,导致错误。如果泛型类型是有界的,例如

宿洋
2023-03-14

我应该做什么来实现方法重载,而不引发错误?

简单:不要试图用具有相同擦除的参数使方法过载。

几个选项:

>

  • 只需给方法不同的名称(即,不要尝试使用重载)
  • 向其中一个重载添加更多参数,以消除歧义(理想情况下,仅当您实际需要这些参数时才这样做;但Java API中有一些示例中存在垃圾参数,只是为了避免重载问题)
  • 绑定类型变量,如@Kayaman所建议:

    <V extends SomethingOtherThanObject>
    

  •  类似资料:
    • 我第一次在Java中使用泛型,我遇到了一个无法克服的问题:为什么这样编译: 但这并不: 我得到了这个错误:两种方法有相同的擦除。 如果这是一个愚蠢的问题,我很抱歉,但我不明白为什么有界类型参数声明中的接口顺序似乎很重要。事实上,我不认为是顺序导致了错误,但我不明白是什么导致了错误。 我正在读Oracle的文档,它说我必须把类作为第一个参数,但是Aa,Bb和Cc都是接口。对我的英语也感到抱歉。

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

    • 如何在不更改方法名称的情况下摆脱以下错误: 我的方法:

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

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

    • 我有两个不同的方法,在两个不同的类中。我希望他们都能阅读同一行输入,并检查不同的内容。一个查找“给我冲杯咖啡”之类的说明,另一个查找不同的关键字,如“请”和“谢谢”(这些影响程序对我的反应): 然后我在我的主字符串中调用它们,只是为了测试它们: 我的控制台显示如下: 我知道发生了什么,但我想不出其他办法。我也尝试过使用同一个扫描仪,不同的字符串,但仍然不起作用。我怎样才能使这两种方法都能读取我的第