Класс является необработанным типом. Ссылки на общий тип Class‹T› должны быть параметризованы

У меня есть следующий класс (из простого учебника 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!");
            }
        }

    }
}

Где класс Validator — это класс org.springframework.validation.Validator из Spring 2.5.

Метод поддержки показывает предупреждение (класс является необработанным типом. Ссылки на класс универсального типа должны быть параметризованы), если я попытаюсь добавить к нему параметры, такие как

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!


person Community    schedule 03.09.2009    source источник
comment
+1 за вопрос и хорошее отношение к отвечающим   -  person KLE    schedule 03.09.2009
comment
Знаешь, если ты примешь один из ответов, то получишь еще несколько баллов...   -  person KLE    schedule 03.09.2009


Ответы (2)


Интерфейс объявляет метод с необработанным типом. В этом случае вы не можете переопределить его без предупреждения.

Причина вашей проблемы в том, что интерфейс Spring был объявлен совместимым с Java 1.4. Обратите внимание, что Spring 3.0 должен предоставлять все классы как совместимые с Java 1.5, так что это решит вашу проблему. Перед обновлением, я думаю, вам придется жить либо с предупреждением, либо с @SuppressWarning.

person KLE    schedule 03.09.2009
comment
Отлично спасибо. Пока мне придется жить с @SuppressWarning. - person ; 03.09.2009
comment
Я рад, что смог тебе помочь. Мне понравилось, что ты не только хочешь, чтобы все работало, но и хочешь понять! Если вам нужно найти работу на юге Франции... ;-) - person KLE; 03.09.2009
comment
Spring LDAP по-прежнему придерживается необработанных типов, верно? Несмотря на то, что основная часть требует Java 1.5? - person AlbeyAmakiir; 17.05.2012

Поскольку интерфейс заставляет вас использовать необработанный тип (т. е. не позволяет указать правильную информацию о типе), вы не можете реализовать его без предупреждений, если не используете @SupressWarnings.

Единственное реальное исправление — исправить интерфейс (т. е. заставить его определять boolean supports(Class<?> aClass)).

person Joachim Sauer    schedule 03.09.2009
comment
Да, я могу пока жить с @SuppressWarning, но если я перейду на логическую поддержку (Class‹?› aClass), я войду в мир стирания типов, и это просто неприятно! Есть ли другой подход или ждать Spring 3.0? - person ; 03.09.2009