2009-08-14 15 views

risposta

12

Prima di tutto, è necessario assicurarsi che il codice venga compilato senza avvisi unckeched. Questo è un buon indicatore. Per capire perché, ti suggerisco di dare un'occhiata allo sample chapter for generics from Effective Java.

secondo luogo di tutti, i generici non si può proteggere dal codice come:

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

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

terzo di tutti, se siete in un modo o nell'altro scherzi con classe Pale, si potrebbe ottenere strano ClassCastExceptions, come in this discussion thread. E 'da capogiro per vedere

java.lang.ClassCastException: javax.mail.Session non può essere lanciato a javax.mail.Session

Quindi la risposta è no , si puo' t sbarazzarsi di ClassCastException s usando correttamente i generici.

+0

+1 Per i getchas di ClassLoader – mtpettyp

2

No. L'utilizzo di Java 5.0 e del tipo generico non rende ClassCastException-proof.

+0

c'è un modo per quello ... –

+1

Se non si esegue il cast, non si dovrebbe vedere alcuna ClassCastException. –

16

Il "ghisa" garantisce che Java 5 fornisce generici è che non si vedrà mai un ClassCastException dai cast inseriti dal compilatore fornito che la compilazione non ha prodotto avvisi "non controllati".

Nella vita reale, spesso non è possibile evitare avvisi non verificati se il proprio codice utilizza librerie legacy (non generati). Quindi il cast generato dal compilatore può lanciare ClassCastException ed è il tuo lavoro impedire ciò assicurando che i valori restituiti dal codice della libreria siano ben tipizzati per le dichiarazioni.

Altrimenti la situazione è invariata. Al di fuori dei generici, se lanci su un tipo incompatibile otterrai una ClassCastException nello stesso modo che hai sempre fatto.

(un buon riferimento per questa e altre domande di farmaci generici è Java Generics and Collections.)

-1

Nope. i generici salvano solo da errori di compilazione, non da eccezioni di runtime.

+0

-1: cos'è un'eccezione di compilazione? –