web-dev-qa-db-fra.com

La classe est un type brut. Les références au type générique Classe <T> doivent être paramétrées

J'ai la classe suivante (à partir d'un simple tutoriel 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!");
            }
        }

    }
}

Où la classe Validator est la classe org.springframework.validation.Validator De Spring 2.5.

La méthode supports affiche un avertissement (la classe est un type brut. Les références au type générique classe doivent être paramétrées), si j'essaye d'ajouter des paramètres à cela tels que

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

J'obtiens l'erreur suivante:

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

Il y a beaucoup de discussions sur ce type de question, mais je veux obtenir une réponse complète et la comprendre sans "cacher" le problème avec un @SupressWarnings!

62
user167768

L'interface déclare la méthode avec un type brut. Dans ce cas, vous ne pouvez pas le remplacer correctement sans l'avertissement.

L'origine de votre problème est que l'interface Spring a été déclarée conforme Java 1.4. Notez que Spring 3.0 est censé fournir toutes les classes en tant que Java 1.5 compatible , donc cela résoudrait votre problème. Avant de procéder à la mise à niveau, je suppose que vous devriez vivre avec l'avertissement ou le @SuppressWarning.

32
KLE

Étant donné que l'interface vous oblige à utiliser le type brut (c'est-à-dire qu'elle ne vous permet pas de spécifier les informations de type correct), vous ne pouvez pas l'implémenter sans avertissements sauf si vous utilisez @SupressWarnings.

Le seul vrai correctif est de corriger l'interface (c'est-à-dire de lui faire définir boolean supports(Class<?> aClass)).

9
Joachim Sauer