2009-09-03 12 views
63

sein ich die folgende Klasse haben (von einer einfachen Feder-Tutorial)Klasse ist ein Rohtyp. Verweise auf generische Typklasse <T> sollte parametrisierte

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

    } 
} 

Wenn der Validator-Klasse die org.springframework.validation.Validator Klasse von Spring 2.5 ist.

Die Träger Methode zeigt eine Warnung (Klasse ein Roh-Typ ist. Verweis auf generische Typ Klasse sollte parametrierbar), wenn ich versuche, so zu diesen Parameter hinzufügen, wie

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

Ich erhalte die folgenden Fehler :

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

es gibt viele Themen über diese Art von Frage, aber ich mag eine vollständige Antwort zu bekommen und zu verstehen, es tatsächlich ohne das Problem mit einem @SupressWarnings ‚versteckt‘!

+0

+1 für Frage, und nette Einstellung zu den Beantwortern – KLE

+0

Sie wissen, wenn Sie eine der Antworten akzeptieren, erhalten Sie einige weitere Punkte ... – KLE

+0

Erledigt. Vielen Dank nochmal. –

Antwort

32

Die Schnittstelle deklariert die Methode mit einem Rohtyp. In diesem Fall können Sie sie nicht ohne Warnung überschreiben.

Der Ursprung Ihres Problems ist, dass die Spring-Schnittstelle als Java 1.4-kompatibel deklariert wurde. Beachten Sie, dass Spring 3.0 alle Klassen als Java 1.5-konform liefern soll, damit Ihr Problem behoben wird. Vor dem Upgrade, denke ich, müssten Sie entweder mit der Warnung oder der @SuppressWarning leben.

+1

Ausgezeichnet danke. Ich muss jetzt mit dem @SuppressWarning leben. –

+6

Ich bin froh, dass ich dir helfen konnte. Mir hat es gefallen, dass du nicht nur das Zeug zum arbeiten willst, sondern auch verstehen willst! Wenn du einen Job in Südfrankreich finden musst ... ;-) – KLE

+0

Es ist immer noch so, dass Spring LDAP mit rohen Typen klebt, oder? Obwohl der Kern davon Java 1.5 benötigt? – AlbeyAmakiir

9

Da die Schnittstelle die Verwendung des unformatierten Typs erzwingt (d. H. Keine Angabe der korrekten Typinformationen ermöglicht), können Sie sie ohne Warnungen nur implementieren, wenn Sie @SupressWarnings verwenden.

Die einzige wirkliche Lösung ist es, die Schnittstelle zu reparieren (d. H. Sie definiert boolean supports(Class<?> aClass)).

+0

Ja, ich kann jetzt mit dem @SuppressWarning leben, aber wenn ich auf boolesche Unterstützung umschalte (Klasse aClass), betrete ich die Welt des Typenlöschens und das ist einfach eklig! Gibt es einen anderen Ansatz oder warte ich auf das Frühjahr 3.0? –