2014-07-23 17 views
5

Come esperimento, ho cercato di estendere un int -array come questo:Perché Java non consente di estendere tipo di matrice

public class IntArrayExtension extends int[]{ 
// additional fields and methods. 
} 

aggiungere alcuni metodi relativi a cernita, lo scambio, sub-array costruzione etc. nella classe stessa. Ma ho ottenuto questo errore durante la compilazione:

IntArrayExtension.java:1: unexpected type 
found : int[] 
required: class 
public class IntArrayExtension extends int[]{ 
             ^
1 error 

Sono curioso di sapere: perché Java non permette di estendere un array?

+0

Potrebbe essere una domanda migliore per i programmatori SE. Vedi anche la mia domanda [qui] (http://programmers.stackexchange.com/a/239194/87528). – Azar

+1

possibile duplicato di [Java: Estendi classe come array] (http://stackoverflow.com/questions/10914928/java-extend-class-as-array) – Eran

+0

perché è un primitivo non una classe. Si potrebbe estendere invece da ArrayList, ma si avrà List –

risposta

9

Estendere un tipo fondamentale come un String o un array apre buchi di sicurezza. Se Java consente di estendere un array, i suoi metodi che utilizzano array diventerebbero insicuri. Questo è il motivo per cui le stringhe sono final e gli array non possono essere estesi affatto.

Ad esempio, è possibile sovrascrivere il metodo clone() e restituire un array di dimensioni errate. Questo ha il potenziale di infrangere la logica del codice di sistema che prende come parametro un array.

Inoltre, gli array sono oggetti speciali in Java, in quanto non hanno una definizione di classe.

ci sono due soluzione al problema che si sta tentando di risolvere:

  • si potrebbe mettere la logica in una classe helper con metodi statici, simile a Collections, ecc o
  • Si potrebbe incapsulare un array all'interno della classe IntArrayExtension e fornisce metodi wrapper per l'accesso alla matrice e alle sue funzionalità aggiuntive.
+0

Penso che l'argomento che consentirebbe a qualcuno di sovrascrivere il metodo 'clone()' potrebbe non essere valido. Se un metodo di una superclasse viene dichiarato come finale, non può essere sovrascritto in una classe derivata. – Mitselplik

+0

Capisco perché vuole farlo. Mi piacerebbe fare lo stesso per aggiungere codice in stile Linq in Java. È scomodo che non si possa dichiarare un array 'Cosa [] lista = nuova Cosa [100];', accedere agli elementi usando la sintassi dell'array 'Cosa thisThing = elenco [50]; 'e utilizzare anche i metodi di estensione:' Cosa [] sottoinsieme = elenco.Dove (nuovo comparatore ,,,). E non puoi ignorare l'operatore [] per semplificare il codice. – Mitselplik

4

Le matrici sono oggetti ma un tipo di matrice non è una classe e pertanto non può essere esteso. Vedi ad esempio JLS #10.8.

+0

+1 Per indicare la documentazione formale. –

Problemi correlati