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

par*_*cer 9 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)  {
    } 
}
Run Code Online (Sandbox Code Playgroud)

我也有这个代码:

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  {
}
Run Code Online (Sandbox Code Playgroud)

这很有效.在第一种情况下V是一个孩子Object,就像在第二种情况下B是一个孩子A.那么为什么第一种情况导致错误,而第二种情况成功编译?

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

And*_*ner 19

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

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

一些选择:

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

    <V extends SomethingOtherThanObject>
    
    Run Code Online (Sandbox Code Playgroud)

  • 我为#1投赞成票。超载是一种便利。从来没有任何_need_提供方法重载(也许有些复杂的情况涉及反射以按名称查找方法)。 (3认同)

Kay*_*man 6

V不是"孩子的Object".V是一个无限制的泛型类型,它会删除Object,从而导致错误.如果泛型类型有界限,例如<V extends Comparable<V>>,它将擦除Comparable并且您不会得到错误.