2009-09-03 9 views
63

I mają następujące klasy (od prostego wiosennego poradniku)Klasa to typ surowy. Odniesienia do typu klasy generycznej <T> powinny być parametryzowana

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

    } 
} 

gdzie klasa Weryfikacji jest klasa org.springframework.validation.Validator od wiosny 2.5.

Sposób podpory wyświetla ostrzeżenie (Klasa jest typem surowe. Odniesienia do typu rodzajowego klasy powinny być parametryzowane), gdy próbuję dodać parametry do tego takie jak

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

otrzymuję następujący błąd :

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

Istnieje wiele wątków na temat tego typu pytanie, ale chcę, aby uzyskać pełną odpowiedź i rzeczywiście zrozumieć go bez „ukrywanie” problem z @SupressWarnings!

+0

+1 za pytanie i miłe podejście do osób udzielających odpowiedzi – KLE

+0

Jeśli zaakceptujesz jedną z odpowiedzi, uzyskasz więcej punktów ... – KLE

+0

Gotowe. Wielkie dzięki jeszcze raz. –

Odpowiedz

32

Interfejs deklaruje metodę z typem nieprzetworzonym. W takim przypadku nie można go przesłonić ładnie bez ostrzeżenia.

Źródłem problemu jest fakt, że interfejs Spring został zadeklarowany jako zgodny z językiem Java 1.4. Należy zauważyć, że Spring 3.0 ma dostarczać wszystkie klasy zgodne z Javą 1.5, aby rozwiązać problem. Przed uaktualnieniem, domyślam się, że musiałbyś żyć z ostrzeżeniem lub @SuppressWarning.

+1

Doskonałe dzięki. Na razie będę musiał żyć z @SuppressWarning. –

+6

Cieszę się, że mogłem ci pomóc. Podobało mi się, że nie tylko chcesz, aby te rzeczy działały, ale także chcesz je zrozumieć! Jeśli chcesz znaleźć pracę na południu Francji ... ;-) – KLE

+0

Wciąż jest tak, że Spring LDAP trzyma się surowych typów, prawda? Mimo że jego główna część wymaga Java 1.5? – AlbeyAmakiir

9

Ponieważ interfejs zmusza użytkownika do używania typu surowego (tzn. Nie pozwala określić poprawnych informacji o typie), nie można go wdrożyć bez ostrzeżeń, chyba że użyto @SupressWarnings.

Jedyną prawdziwą poprawką jest naprawienie interfejsu (tzn. Zdefiniowanie go jako boolean supports(Class<?> aClass)).

+0

Tak, na razie mogę żyć z @SuppressWarning, ale jeśli zmienię na boolean (klasa aClass) wkraczam w świat typu wymazania i to jest po prostu paskudne! Czy jest inne podejście, czy mogę czekać na Spring 3.0? –

Powiązane problemy