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

Overloading a method: both methods have same erasure

我有以下代码但它不起作用:出现错误 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  {
}

这行得通。在第一种情况下 VObject 的子级,就像在第二种情况下 BA 的子级一样。那为什么第一种情况会出错,而第二种情况会编译成功呢?

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

V 不是 "a child of Object"。 V 是无界泛型类型,擦除为 Object,导致错误。如果泛型类型是有界的,例如 <V extends Comparable<V>>,它将擦除为 Comparable 而您不会得到错误。

What should I do to achieve method overloading, without raising an error?

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

几个选项:

  1. 只需给方法不同的名称(即不要尝试使用重载)
  2. 向其中一个重载添加更多参数,以允许消除歧义(理想情况下,只有在您确实 需要 这些参数时才这样做;但是 Java 中有示例API 其中存在垃圾参数只是为了避免过载问题)。
  3. 按照:

    的建议绑定类型变量
    <V extends SomethingOtherThanObject>