2012-09-15 23 views
12

スーパークラスのメソッドをオーバーライドする場合、Javaでは戻り値の型を共変できます。Javaの反復型パラメータ型がオーバーライドできないのはなぜですか?

反復型パラメータの種類が対照的なのはなぜですかはメソッドをオーバーライドするときに許可されますか?

+4

[なぜオーバーライドのためのパラメータの逆分散はないのですか?](http://stackoverflow.com/questions/2995926/why-is-there-no-parameter-contra-variance-for-overriding) –

+0

ありがとうございます。私はこれを見てきましたが、C++の答えを理解するのが難しかったです。なぜなら、私はC++に全く慣れていないからです。 – Will

+0

私はリンクされたポストを読んで、この機能から得られる利益が驚きの増加要因を上回らないことを理解する限り、特定の実装にオーバーロードされたメソッドを提供することは難しくありません。私は、この機能の他のユースケースが何を見ているのでしょうか?そのクラスのメソッドを直接呼び出す場合を除きます。 –

答えて

15

これはoverloadingと呼ばれています。

特に、戻り値の型は、オーバーロード時に考慮されないため、スーパークラスまたはインターフェイスの実装とまだ一致しているため、共変できます。オーバーロード時にパラメータが考慮されます。 Number doSomethingWithNumber(Number value)と比較して、Number doSomethingWithNumber(Integer value)の最適化があります。

+0

反変パラメータを持つと仮定すると、依然としてオーバーライドされますが、私たちが遭遇する問題は何ですか?私は何かのようなものを探しています:http://stackoverflow.com/a/2996901/715236しかし、スーパークラスの複数をオーバーライドするサブクラスのメソッドを持つことについて悪いのは何ですか? – Will

+0

最大の問題は、チェーンのどこかで基本型オーバーロードが与えられたときに過負荷を提供できないことです。参照は単純な等号から等しいかそれ以上の基本的な署名に変えなければならないので、これは多相関数呼び出しを混乱させてしまいます。デザインの観点から、 'AがBを拡張し、' BがCを拡張するが、 'B'があなたのリンクから' void f(Object o) 'を提供する場合、' A'はより多くを実装する機会を持たない特定のオーバーロードされたメソッド。これは悪夢になるだろう。 – pickypg

+1

最も重要なことは、遅れてオーバーライドされるAPIにつながると思います。これは、内部的に適切なメソッドを呼び出すために使用される非常に醜い定型コードになります。 'void f(Object o){if( o instanceof整数)f((整数)o); } '。そして、あなたはそれがどのように機能するのか尋ねなければなりませんか?オーバーライド動作を可能にするには、 'Object'パラメータメソッドが' Integer'パラメータメソッドをオーバーライドすることを意味します。したがって、上記のコードは、スタックオーバーフローするまで無限ループを引き起こします。オブジェクトメソッド。 – pickypg

関連する問題