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

62 java generics warnings type-erasure suppress-warnings

我有以下课程(来自简单的Spring教程)

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!");
            }
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

Validator类是org.springframework.validation.ValidatorSpring 2.5中的类.

support方法显示一个警告(Class是一个原始类型.对泛型类的引用应该参数化),如果我尝试添加参数,如

public boolean supports(Class<?> aClass) ...
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

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

关于这类问题有很多线索,但我希望得到一个完整的答案并实际理解它,而不是"隐藏"问题@SupressWarnings!

KLE*_*KLE 32

接口使用原始类型声明方法.在这种情况下,如果没有警告,你不能很好地覆盖它.

问题的根源是Spring接口被声明为符合Java 1.4.请注意,Spring 3.0应该提供符合Java 1.5的所有类,这样可以解决您的问题.在你升级之前,我想你将不得不忍受警告或@SuppressWarning.

  • 我很高兴能帮到你.我喜欢它,你不仅希望这些东西能够运作,而且还想要理解!如果你需要在法国南部找工作...... ;-) (6认同)

Joa*_*uer 9

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

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