类是原始类型。对泛型类型 Class<T> 的引用应参数化

我有以下课程(来自一个简单的春季教程)

public class CarValidator implements Validator {

    public boolean supports(Class aClass) {
        return Car.class.equals(aClass);
    }

    public void validate(Object obj, Errors errors) {
        Car car = (Car) obj;

        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "model", "field.required", "Required field");

        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "price", "field.required", "Required field");

        if( ! errors.hasFieldErrors("price")) {
            if (car.getPrice().intValue() == 0) {
                errors.rejectValue("price", "not_zero", "Can't be free!");
            }
        }

    }
}

其中 Validator 类是 Spring 2.5 中的类。org.springframework.validation.Validator

支持方法显示警告(类是原始类型。对泛型类型 Class 的引用应该参数化),如果我尝试向其中添加参数,例如

public boolean supports(Class<?> aClass) ...

我收到以下错误:

The method supports(Class<?>) of type CarValidator has the same erasure as supports(Class) of type Validator but does not override it

关于这种类型的问题有很多线程,但我想得到一个完整的答案,并真正理解它,而不是“隐藏”问题!@SupressWarnings


答案 1

接口使用原始类型声明方法。在这种情况下,如果没有警告,您就无法很好地覆盖它。

问题的根源在于Spring接口被声明为符合Java 1.4。请注意,Spring 3.0应该将所有类都作为Java 1.5兼容提供,因此这将解决您的问题。在升级之前,我想您必须忍受警告或.@SuppressWarning


答案 2

由于接口强制您使用原始类型(即不允许您指定正确的类型信息),因此除非您使用 .,否则您无法在没有警告的情况下实现它。@SupressWarnings

唯一真正的解决方法是修复接口(即使其定义)。boolean supports(Class<?> aClass)


推荐