2012-05-03 3 views
9

Che tipo di eccezione dovrei buttare se il tipo sbagliato di oggetto viene passato nel mio metodo compareTo?Quale tipo di eccezione devo gettare se viene passato il tipo di oggetto sbagliato?

ClassCastException?

+0

ci mostri il tuo 'codice compareTo'? – adarshr

+2

Beh, questo dipende da come gestireste quell'eccezione. Probabilmente lancio un 'IllegalArgumentException' con un messaggio appropriato. A proposito, potrebbe esserci un modo per non permettere il passaggio del tipo sbagliato di oggetto? Potresti approfondire il caso d'uso? Forse potremmo aiutarti a prevenire quel controllo di runtime e usare la potenza del compilatore. Si noti che 'Comparable' può essere ridimensionato con un parametro di tipo generico, quindi' compareTo' può usare parametri specifici. – Thomas

+1

Se esegui downcasting nell'implementazione di compareTo, riceverai gratuitamente CCE. Perché preoccuparsi di lanciarlo esplicitamente. –

risposta

18

Sarebbe IllegalArgumentException in senso generale, quando il passato di valore non è quello giusto.

Tuttavia, come suggerisce @Tom's answer below, potrebbe anche essere un ClassCastException per tipi errati. Tuttavia, devo ancora incontrare il codice utente che lo fa.

Ma fondamentalmente, se si utilizza lo compareTo con i generici, sarà un errore in fase di compilazione.

Considerate questo:

public class Person implements Comparable<Person> { 
    private String name; 
    private int age; 

    @Override 
    public int compareTo(Person o) { 
     return this.name.compareTo(o.name); 
    } 
} 

Dove si vede la possibilità di un tipo sbagliato di essere passati nell'esempio di cui sopra?

+3

+1: è meglio ottenere un tempo di compilazione rispetto a un errore di runtime. –

+0

Perché il downvote? – adarshr

+0

Sembra che tu non sia d'accordo con i documenti API che sono entusiasti di 'ClassCastException'. –

6

Non sorprende che la API docs specificare l'eccezione ad essere gettato in questo caso.

ClassCastException - se il tipo dell'oggetto specificato lo impedisce da confrontato a questo oggetto.

Supponendo che si stiano utilizzando i generici, si otterrà automaticamente questa eccezione se qualcuno tenta di chiamare i propri metodi utilizzando tipi non elaborati, riflessioni o altre tecniche non sicure.

+0

Non sono d'accordo con questo dato che 'ClassCastException' sarà lanciato dalla JVM, dove l'OP sta chiedendo un'eccezione _che ha bisogno di lanciare. Pertanto preferisco la risposta 'IllegalArgumentException'. Forse è una cosa di linguaggio, comunque. – maksimov

+1

@maksimov I documenti API sono molto chiari. Non sei d'accordo con le specifiche del metodo, che è una posizione insolita da prendere. –

+0

Tom, ho appena capito che devo essere cieco. In qualche modo sono riuscito a filtrare i "confronti" che stanno implementando.Mi piacerebbe cambiare la mia affermazione sopra ora :-) – maksimov