首页 > 解决方案 > 如何按参数类型选择重载方法?

问题描述

我正在尝试根据参数类型重载我的方法:

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>and 调用上述方法List,无论上面的元素是哪种类型(ObjectErrorFieldErrorList
getMessage(final ObjectError objectError)都会被调用。

在此处输入图像描述

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

为什么会这样?如果它只是它的工作原理,有没有机会不使用if's和instanceof's?

标签: javapolymorphismoverloading

解决方案


方法重载决议是在编译时执行的,此时只有编译时类型是已知的。因此,传递给方法调用的参数的编译时类型决定了选择哪个重载方法。

由于您将 a 的元素传递List<ObjectError>给方法调用,String getMessage(final ObjectError objectError)因此始终选择它,并且存储在其中的实例的运行时类型List没有任何区别。

解决问题的一种方法是将getMessage()方法移至类,并在子类ObjectError中覆盖它。FieldError

代替

getMessage(errors.get(0))

你会打电话给

errors.get(0).getMessage()

这将起作用,因为方法覆盖是在运行时解决的。


推荐阅读