2010-02-11 13 views
17

Mi chiedevo perché il metodo di ordinamento della classe Array richiede un parametro di tipo Object []. Perché il parametro non è di tipo Comparable []. Se non si passa a Comparable [] viene generata una ClassCastException.Perché Arrays.sort accetta Object [] anziché Comparable []?

Perché ... pubblico sorta static void (Object [] a) e non public static void sort (paragonabile [] a)? Grazie

+0

Hai stessa situazione in altri luoghi del Java API, per esempio ObjectOutputStream che si aspetta un oggetto che implementa serializzabile. Immagino, gli sviluppatori hanno cercato di impedirci di fare cast inutili. – ZeissS

+0

Nel corso della giornata, c'erano più persone che implementavano JDK, non solo Sun. Le implementazioni della classe potrebbero aver desiderato il Comparabile, ma consentito qualsiasi ordinamento deterministico e stabile. (Ipoteticamente parlando) – Kylar

risposta

8

Poiché il secondo modulo richiederebbe una riassegnazione della matrice. Anche se sai che il tuo array contiene solo comparabili, non puoi lanciarlo su Comparable [] se il tipo originale era Object [], poiché il tipo di array non corrisponde.

Si può fare:

Object[] arr = new String[0]; 
String[] sarr = (String[]) arr; 

Ma non si può fare:

Object[] arr = new Object[0]; 
String[] sarr = (String[]) arr; 

Quindi è l'ottimizzazione prematura :)

4

Altrimenti non può passare in Object[].

+1

@BalusC C'è mai una situazione in cui si passa per ordinare una matrice di oggetti che non si conoscevano tutti implementando 'Comparable'? Qualsiasi utilizzo del metodo sort sarà effettuato da oggetti che sono 'Comparable'. Sembra che l'unica ragione per accettare 'Object []' è che 'Object' è usato più frequentemente ed è più familiare, e come detto da ZeissS, altrimenti dovremmo lanciare. –

+5

Ci sono ancora molti metodi 'toArray()' nell'API Java che restituisce 'Oggetto []'. – BalusC

+1

Potrebbero implementare 'Comparator ', che è simile, ma non uguale a 'Comparable ' – chama

Problemi correlati