引数の型によってオーバーロードされた方法を選択するには?

ポール・ソスノフスキー:

私は、引数の型に応じて、私のメソッドをオーバーロードしようとしています:

FieldErrorは拡張ObjectErrorを

private String getMessage(final FieldError fieldError) {
    return String.format("%s %s", fieldError.getField(), fieldError.getDefaultMessage());
}

private String getMessage(final ObjectError objectError) {
    return objectError.getDefaultMessage();
}

今、私が持っている場合はList<ObjectError>、その要素のための方法上記の呼び出しListに関係なく、どの種類(ObjectErrorまたはFieldError)上の要素List、している
のgetMessage(最終ObjectError objectError)は常に呼び出されます。

ここでは、画像の説明を入力します。

List<ObjectError> errors;
getMessage(errors.get(0));

なぜそれがこのように動作していますか?それはそれが動作するだけでどのようなら、使用していない任意のチャンスがあるifのとinstanceofのは?

彼らは次のとおりでした:

メソッドオーバーロード解決のみコンパイル時の型が既知である場合、コンパイル時に行われます。したがって、メソッド呼び出しに渡されるパラメータのコンパイル時の型が選択されるオーバーロードされたメソッドのかを決定します。

あなたがの要素を渡しているので、List<ObjectError>メソッド呼び出しに、String getMessage(final ObjectError objectError)常に選択され、その中に保存されたインスタンスの実行時の型がList違いはありません。

あなたの問題を解決する1つの方法は、移動することであるgetMessage()にメソッドをObjectErrorクラス、およびそれをオーバーライドするFieldErrorサブクラス。

の代わりに

getMessage(errors.get(0))

あなたは電話しますよ

errors.get(0).getMessage()

オーバーライドは、実行時に解決されるので、これは動作します。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=200149&siteId=1