web-dev-qa-db-ja.com

メソッドのオーバーロード:両方のメソッドの消去は同じです

次のコードがあり、機能しません:エラー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の子です。2番目のケースと同様に、BAの子です。では、なぜ最初のケースはエラーになりますが、2番目のケースは正常にコンパイルされますか?

[〜#〜] edit [〜#〜]:エラーを発生させずにメソッドのオーバーロードを実現するにはどうすればよいですか?

13
parsecer

エラーを発生させることなく、メソッドのオーバーロードを実現するにはどうすればよいですか?

シンプル:同じ消去のパラメーターでメソッドをオーバーロードしないでください。

いくつかのオプション:

  1. メソッドに異なる名前を付けるだけです(つまり、オーバーロードを使用しないでください)。
  2. 明確化を可能にするために、オーバーロードの1つにさらにパラメーターを追加します(これらのパラメーターが実際に必要である場合にのみこれを行うのが理想的ですが、Java APIは、単に過負荷の問題を回避するためにジャンクパラメータがあります)。
  3. @ Kayaman で提案されているように、type変数をバインドします。

    <V extends SomethingOtherThanObject>
    
20
Andy Turner

Vは「Objectの子」ではありません。 Vは無制限のジェネリック型であり、Objectに消去され、エラーが発生します。 <V extends Comparable<V>>などのジェネリック型がバインドされている場合は、Comparableに消去され、エラーは発生しません。

6
Kayaman