2013-06-14 9 views
6

In attuazione di una pila generico, il seguente linguaggio viene utilizzato e funziona senza alcun problemacolata Object [] a una matrice di tipo di riferimento in java

public class GenericStack<Item> { 
    private int N; 
    private Item[] data;  

    public GenericStack(int sz) { 
     super(); 
     data = (Item[]) new Object[sz]; 

    } 
     ... 
} 

Tuttavia quando provo quanto segue, provoca un ClassCastException

String[] stra = (String[]) new Object[4]; 

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String; 

Come spieghi questo?

+0

La stringa non eredita dall'elemento, quindi il cast non è possibile. – Piovezan

+1

@Piovezan 'String' e' Item' non sono nella stessa riga. – Dukeling

+0

'new GenericStack (10)' funziona ma se si prova 'String [] stra = new GenericStack (10).getData(); '(implementa il getter corrispondente), fallisce con ClassCastException. Quindi non funziona "veramente", il cast non è stato fatto magicamente. –

risposta

3

Casting un new Object[4] ad un String[] non funziona perché un Object[] non è un String[], proprio come un Object non è un String.

Il primo esempio funziona a causa di type erasure. Durante il runtime, il parametro di tipo Item è stato cancellato a Object. Tuttavia sarebbe simile esito negativo se si è tentato di assegnare la matrice a un tipo reifiable, ad esempio se non fosse dataprivate:

String[] strings = new GenericStack<String>(42).data; 

Questo sarebbe simile gettare un ClassCastException, perché ciò che è in realtà un Object[] sarebbero gettati a String[].

0

penso che questa è la migliore risposta a questa domanda:

"A String [] non è un oggetto [], che è un po 'contro-intuitivo Stai incontrando il" Banana is-a frutta "ma uno scenario" Elenco delle banane non è un elenco di frutta "."

Rif: https://stackoverflow.com/a/1018774/847818

Dalla stessa domanda, come lanciare:

String[] stringArray = Arrays.copyOf(objectArray, objectArray.length, String[].class); 

o

String[] stringArray = Arrays.asList(objectArray).toArray(new String[objectArray.length]); 
+2

L'azione corretta potrebbe essere semplicemente un commento sulla domanda che dice qualcosa come "[Possibile duplicato] (http: // stackoverflow. com/domande/1018750/how-to-convert-oggetto-array-to-string-array-in-java)". – Dukeling

+0

Forse, ma personalmente se la risposta non è la stessa, aspetterei un riscontro dall'OP. Forse chiederà qualcosa di più e di diverso. :) – Enrichman

+0

grazie a @Enrichman per il link, ho ottenuto il codice generico dello stack dal libro algo di sedgewick .. il tuo link mi ha aiutato a capirlo meglio – damon

2

A causa di generici tipo di cancellazione serie dell'oggetto diventa matrice Object effectivelly. Pertanto, digitare corrispondenze. Ma quando lo fai con il tipo concreto String non lo fa. Nessun tipo di cancellazione viene applicata e non riesce.

1

Penso che se un riferimento alla classe Object punta a qualsiasi oggetto classe figlio come la classe String o qualsiasi altra classe, solo allora possiamo eseguire il riferimento classe oggetto a quella particolare classe (quale oggetto abbiamo creato e assegnato alla classe Object ref) e assegnare un riferimento ad esso. e se creiamo un oggetto diretto della classe Object (come hai detto) non funzionerà.

Esempio:

Object[] obj = new String[4]; 
String[] stra = (String[]) obj; 

sopra il codice non genererà alcun ClassCastException.

Spero che questo aiuti