ポール・ソスノフスキー:
私は、引数の型に応じて、私のメソッドをオーバーロードしようとしています:
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()
オーバーライドは、実行時に解決されるので、これは動作します。