2009-08-14 11 views

Odpowiedz

12

Przede wszystkim upewnij się, że Twój kod kompiluje się bez niepotwierdzonych ostrzeżeń. To dobry wskaźnik. Aby zrozumieć, dlaczego, proponuję spojrzeć na sample chapter for generics from Effective Java.

drugie, leki generyczne nie mogą ustrzec się od kodu, takich jak:

public void methodOne(Integer argument) { 
    methodTwo(argument); 
} 

public void methodTwo(Object argument) { 
    System.out.println(((Date) argument).getTime()); 
} 

trzecia wszystkich, jeśli jesteś w jakiś sposób lub inny brudząc z klasy ładowarki, można dostać dziwne ClassCastExceptions, tak jak w this discussion thread. To umysł paraliżujący zobaczyć

java.lang.ClassCastException: javax.mail.Session nie mogą być oddane do javax.mail.Session

Więc odpowiedź brzmi nie, można” t pozbyć się ClassCastException s tylko przez prawidłowo przy użyciu generics.

+0

+1 Dla klas ClassLoadera – mtpettyp

2

Nie. Używanie Java 5.0 i typów generycznych nie powoduje, że ClassCastException jest odporny na błędy.

+0

jest jakiś sposób na to ... –

+1

Jeśli w ogóle nie rzucasz, nie powinieneś widzieć żadnego wyjątku ClassCastException. –

16

W „żeliwny” gwarancji, że Java 5 rodzajowych zapewnia, że ​​nigdy nie zobaczysz ClassCastException z odlewów wstawionych przez kompilator warunkiem że kompilacja produkowane nie „niesprawdzony” ostrzeżenia.

W rzeczywistości często nie można uniknąć niezaznaczonych ostrzeżeń, jeśli twój kod używa starszych (nie generowanych) bibliotek. Następnie wygenerowane przez kompilator rzutnie mogą rzucić ClassCastException, a Twoim zadaniem jest zapobiec temu, zapewniając, że wartości zwrócone przez kod biblioteki są dobrze wpisane dla deklaracji.

W przeciwnym razie sytuacja nie ulegnie zmianie. Poza typami generycznymi, jeśli rzutujesz na niekompatybilny typ, otrzymasz wyjątek ClassCastException w taki sam sposób, jak zawsze.

(dobrym przykładem na to i inne pytania leków generycznych jest Java Generics and Collections.)

-1

Nie. tylko generics pozwalają ci zaoszczędzić na błędach podczas kompilacji, a nie na wyjątkach w czasie wykonywania.

+0

-1: Co to jest wyjątek czasu kompilacji? –