2009-09-03 13 views
63

ho la classe seguente (da un semplice tutorial primavera)La classe è un tipo non elaborato. I riferimenti al tipo generico Classe <T> dovrebbero essere parametrizzato

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

    } 
} 

in cui la classe Validator è la classe org.springframework.validation.Validator da Spring 2.5.

Il metodo supporta sta mostrando un avviso (Class è un tipo grezzo. I riferimenti al tipo di classe generica devono essere parametrizzate), se cerco di aggiungere parametri a questo come ad esempio

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

ottengo il seguente errore :

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

ci sono un sacco di discussioni su questo tipo di domanda, ma voglio ottenere una risposta completa e realmente capire senza 'nascondere' il problema con un @SupressWarnings!

+0

+1 per domande e un buon atteggiamento nei confronti dei rispondenti – KLE

+0

Sapete, se accettate una delle risposte, otterrete altri punti ... – KLE

+0

Fatto. Molte grazie ancora. –

risposta

32

L'interfaccia dichiara il metodo con un tipo non elaborato. In tal caso, non è possibile sovrascriverlo senza l'avviso.

L'origine del problema è che l'interfaccia Spring è stata dichiarata conforme a Java 1.4. Si noti che Spring 3.0 dovrebbe fornire tutte le classi conformi a Java 1.5, in modo da risolvere il problema. Prima di eseguire l'aggiornamento, suppongo che tu debba convivere con l'avviso o con lo @SuppressWarning.

+1

Eccellente grazie. Dovrò vivere con @SuppressWarning per ora. –

+6

Sono felice di poterti aiutare. Mi è piaciuto che tu non voglia solo che le cose funzionino, ma anche che tu voglia capire! Se hai bisogno di trovare un lavoro nel sud della Francia ... ;-) – KLE

+0

E 'ancora il caso che Spring LDAP si attacchi con i tipi raw, giusto? Anche se la parte principale di esso richiede Java 1.5? – AlbeyAmakiir

9

Poiché l'interfaccia obbliga a utilizzare il tipo non elaborato (ovvero non consente di specificare le informazioni sul tipo corretto) non è possibile implementarlo senza avvisi a meno che non si utilizzi @SupressWarnings.

L'unica soluzione reale consiste nel risolvere l'interfaccia (ad esempio, definirla boolean supports(Class<?> aClass)).

+0

Sì, per ora posso convivere con @SuppressWarning, ma se cambio i supporti booleani (Classe aClass) entro nel mondo della cancellazione dei tipi e questo è semplicemente brutto! C'è un approccio diverso o aspetto Spring 3.0? –

Problemi correlati