如何在Java中正确地覆盖一个函数?

3

我有以下的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;
    }

}

最后,我的另一个抽象控制器。
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注解会报错,提示“方法不是从其父类中继承的方法”。我原以为由于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;
    }
}

3
您需要为基础类型指定类型参数。 - SLaks
希望不会太麻烦,您能否用示例代码来回答? - abiieez
CommonPersist 是否继承自 BasePersist - Timothy Truckle
@TimothyTruckle 是的 - abiieez
在Java中,我们不称之为“function”,而是称之为method(方法)... - Timothy Truckle
1个回答

3

您的CommonController类继承于BaseController,但没有指定任何类型参数(<...>)。

因此,编译器将其解释为BaseController<Object, Object>

您的方法不需要把Object作为参数,所以它与基础类型不匹配。

您需要在extends子句中指定类型参数:

public abstract class
  CommonController<T extends CommonPersist, K extends CommonBO>
       extends BaseController<T,K> {

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接