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

2022-09-02 09:22:39

我有以下代码,但它不起作用:出现错误。both methods have same erasure

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

这很有效。在第一种情况下是 的子项,就像在第二种情况下是 的子项一样。那么为什么第一种情况导致错误,而第二种情况编译成功呢?VObjectBA

编辑:我应该如何实现方法重载,而不会引发错误?


答案 1

我应该如何实现方法重载,而不会引发错误?

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

几个选项:

  1. 只需为方法指定不同的名称(即不要尝试使用重载)
  2. 向其中一个重载添加更多参数以允许消除歧义(理想情况下,仅在实际需要这些参数时才执行此操作;但是在 Java API 中有一些示例,其中有垃圾参数只是为了避免重载问题)。
  3. 绑定类型变量,如 @Kayaman 建议:

    <V extends SomethingOtherThanObject>
    

答案 2

V不是“孩子”。 是一个无界泛型类型,它将擦除 到 ,从而导致错误。如果泛型类型是有界的,例如 ,它将擦除到,并且您不会收到错误。ObjectVObject<V extends Comparable<V>>Comparable


推荐