2013-06-14 13 views
6

w realizacji ogólnej stosu następujące idiom jest używany i działa bez problemuodlewania obiektu [] na tablicę typu referencyjnych Java

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

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

    } 
     ... 
} 

Jednak przy próbie następuje, powoduje ClassCastException

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

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

Jak to wyjaśnić?

+0

Łańcuch nie dziedziczy z elementu, w związku z czym oddanie nie jest możliwe. – Piovezan

+1

@Piovezan 'String' i' Item' nie znajdują się w tej samej linii. – Dukeling

+0

'nowa GenericStack (10)' działa, ale jeśli spróbujesz 'String [] stra = new GenericStack (10).getData(); '(implementuj odpowiedni program pobierający), kończy się niepowodzeniem z klasą ClassCastException. Tak więc nie "naprawdę" działa, obsada nie została zrobiona magicznie. –

Odpowiedz

3

rzucając new Object[4] Do String[] nie działa, ponieważ Object[] nie jest String[], podobnie jak u Object nie jest String.

Pierwszy przykład działa z powodu type erasure. W czasie wykonywania parametr typu Item został usunięty do Object. Jednak nie byłoby podobnie jeśli próbowali przypisać tablicę typu reifiable, na przykład jeśli data nie było private:

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

To podobnie rzucać ClassCastException, ponieważ to, co jest rzeczywiście Object[] byłyby oddane do String[].

0

myślę, że to jest najlepsza odpowiedź na to pytanie:

„Ciąg [] nie jest Object [], który jest trochę intuicyjne Ty napotkaniu” Banan jest-a owoc "ale" Lista bananów nie jest scenariuszem ".

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

Z tym samym pytaniem, jak obsada:

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

lub

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

Prawidłowe działanie tutaj mogło być po prostu komentarzem do pytania mówiącego coś w stylu "[Możliwy duplikat] (http: // stackoverflow. com/questions/1018750/how-to-convert-object-array-to-string-array-in-java) ". – Dukeling

+0

Prawdopodobnie, ale osobiście, jeśli odpowiedź nie jest taka sama, poczekam na informację zwrotną z PO. Może poprosi o coś więcej i więcej. :) – Enrichman

+0

dziękuje @Enrichman za link, mam ogólny kod stosu z książki sedgewick algo .. Twój link pomógł mi zrozumieć lepiej – damon

2

powodu rodzajowych typu Erasure tablica Przedmiot staje się tablica Object effectivelly. Dlatego wpisz dopasowania. Ale kiedy robisz to z konkretnym typem String, tak nie jest. Brak usuwania typu zostanie zastosowany i nie powiedzie się.

1

Myślę, że jeśli odwołanie do klasy Object wskazuje na dowolny obiekt klasy potomnej, taki jak klasa String lub jakakolwiek inna klasa, wówczas możemy tylko rzucić odwołanie do klasy obiektu do tej konkretnej klasy (który obiekt został utworzony i przypisany do klasy obiektu ref) i przypisać do niego odniesienie. a jeśli stworzymy obiekt bezpośredni klasy Object (jak już wspomniano) nie zadziała.

przykład:

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

powyżej kodu nie będzie generował żadnej ClassCastException.

Nadzieja to pomaga

Powiązane problemy