我有以下 BO
@Data
public abstract class CommonBO extends BaseBO{
@NotBlank(message ="{validation.not.blank}")
@Length(max = 100)
String name;
}
@Data
@MappedSuperclass
public abstract class CommonPersist extends BasePersist {
@Column(unique = true,nullable = false)
private String name;
}
然后是我的 BaseController
public abstract class BaseController <T extends BasePersist, K extends BaseBO> {
@RequestMapping(value = "/validate", method = RequestMethod.POST)
@ResponseBody
public ValidationResponse validate(@Valid K t,
BindingResult result, Locale locale) {
ValidationResponse res = new ValidationResponse();
List<ErrorMessage> errorMessages = new ArrayList<>();
if (!result.hasErrors()) {
res.setStatus(MessageTypes.SUCCESS);
} else {
res.setStatus(MessageTypes.FAIL);
List<FieldError> allErrors = result.getFieldErrors();
errorMessages = new ArrayList<>();
for (FieldError objectError : allErrors) {
errorMessages.add(new ErrorMessage(objectError.getField(),
objectError.getDefaultMessage()));
}
}
res.setErrorMessageList(errorMessages);
return res;
}
}
最后,我的另一个抽象 Controller
public abstract class CommonController<T extends CommonPersist, K extends CommonBO> extends BaseController {
@Override
public ValidationResponse validate(@Valid K t, BindingResult result, Locale locale) {
ValidationResponse res = super.validate(t, result, locale);
if (res.getStatus().equalsIgnoreCase(MessageTypes.SUCCESS)) {
if (commonService.checkIfNameIsUsed(t.getName(), t.getId())) {
ErrorMessage em = new ErrorMessage("name", messageSource.getMessage("error.duplicate.is.used", null, locale));
res.getErrorMessageList().add(em);
res.setStatus(MessageTypes.FAIL);
}
}
return res;
}
}
@Override
注释给出了“方法不覆盖其父类(super class)中的方法”的错误。我认为既然 CommonBo extends BaseBO
,@Override 函数应该覆盖 BaseController 中的方法?
已更新
基于@Slaks 的回答
public abstract class CommonController<T extends CommonPersist, K extends CommonBO> extends BaseController<T,K> {
@Override
public ValidationResponse validate(@Valid K t, BindingResult result, Locale locale) {
ValidationResponse res = super.validate(t, result, locale);
if (res.getStatus().equalsIgnoreCase(MessageTypes.SUCCESS)) {
if (commonService.checkIfNameIsUsed(t.getName(), t.getId())) {
ErrorMessage em = new ErrorMessage("name", messageSource.getMessage("error.duplicate.is.used", null, locale));
res.getErrorMessageList().add(em);
res.setStatus(MessageTypes.FAIL);
}
}
return res;
}
}
最佳答案
你的 CommonController
类扩展 BaseController
, 但未指定任何类型参数 ( <...>
)。
因此,编译器将其解释为 BaseController<Object, Object>
.
你的方法不需要 Object
作为参数,因此它与基本类型不匹配。
您需要在 extends
中指定类型参数子句:
public abstract class
CommonController<T extends CommonPersist, K extends CommonBO>
extends BaseController<T,K> {
关于java - 如何正确覆盖 Java 中的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48045420/