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

时间:2017-04-16 21:49:15

标签: java generics jvm javac

我有以下代码但不起作用:出现错误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的孩子一样。那么为什么第一种情况导致错误,而第二种情况成功编译?

编辑:如何在不引发错误的情况下实现方法重载?

2 个答案:

答案 0 :(得分:17)

  

如何在不引发错误的情况下实现方法重载?

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

一些选择:

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

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

答案 1 :(得分:6)

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