java - 如何按参数类型选择重载方法?
问题描述
我正在尝试根据参数类型重载我的方法:
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>
and 调用上述方法List
,无论上面的元素是哪种类型(ObjectError
或FieldError
)List
,
getMessage(final ObjectError objectError)都会被调用。
List<ObjectError> errors;
getMessage(errors.get(0));
为什么会这样?如果它只是它的工作原理,有没有机会不使用if
's和instanceof
's?
解决方案
方法重载决议是在编译时执行的,此时只有编译时类型是已知的。因此,传递给方法调用的参数的编译时类型决定了选择哪个重载方法。
由于您将 a 的元素传递List<ObjectError>
给方法调用,String getMessage(final ObjectError objectError)
因此始终选择它,并且存储在其中的实例的运行时类型List
没有任何区别。
解决问题的一种方法是将getMessage()
方法移至类,并在子类ObjectError
中覆盖它。FieldError
代替
getMessage(errors.get(0))
你会打电话给
errors.get(0).getMessage()
这将起作用,因为方法覆盖是在运行时解决的。
推荐阅读
- php - PHP:找到相同的键时如何不替换数组中的键
- active-directory - PC 的 DNS 名称是否可以在活动目录域中解析?
- javascript - 如何导入 javascript 文件以与 Vue-Router 一起使用
- linux - 在 csv 文件中下载许多 URL 并在 Linux 中另存为
- kotlin - Kotlin 协程流中 RxJava .toList() 的等价物
- c# - 使用 Microsoft Graph API V1.0 时匹配部门名称的问题
- javascript - Math.random 函数 + 使用 ngSwitch JS Angular
- typo3 - TYPO3 9.5 介绍包
- android - Unity:您上传了一个在调试模式下签名的 APK 或 Android App Bundle。您需要在发布模式下签署您的 APK 或 Android App Bundle
- cucumber - Scenario.getSourceTagNames 不包括场景大纲示例部分下的标签