2009-05-08 15 views
3

Ist es möglich, ein Array von Stapeln zu erstellen, ohne die Stapeln zu werfen, wenn sie herauskommen? Eklipse gibt mir eine Warnung über nicht eine allgemeine Anordnung von Stapeln machen zu können, wenn ich so etwas tun:Array von Stapeln

Stack<Card>[] cards = new Stack<Card>[52]; 
+0

, wenn Sie Ihren Code-Schnipsel mit vier Leerzeichen einrücken werde es formatiert korrekt – Cogsy

+0

ähnliche Frage mit einigen guten Antworten: http://stackoverflow.com/questions/217065/Ich kann nicht erstellen-ein-Array-von-LinkedLists-in-Java –

+0

Ich denke, es ist ein Fehler und keine Warnung, da "neue Stack [52]" ist nicht in Java erlaubt - ein bisschen versteckt hier: http://java.sun.com/docs/books/jls/third_edition/html/arrays.html#10.3 –

Antwort

0

Nun, das Array muss keine generisch sein, weil er immer da dies definiert ist. Warum denkst du, du musst wirken? Ich denke, dass Eclipse hier etwas verwirrt ist.

+0

Eclipse ist nicht verwirrt: "... Es ist eine Kompilierung- Zeitfehler wenn das Element ty pe ist kein verifizierbarer Typ ... "siehe http://java.sun.com/docs/books/jls/third_edition/html/arrays.html#10.3 –

1

Warum verwenden Sie Arrays überhaupt?

Es ist eine Low-Level-Programmierstruktur.

Verwenden Sie stattdessen List oder Set (z. B. org.apache.commons.collections.list.LazyList), wenn Sie sich nicht mit der Initialisierung befassen möchten.

Oder zumindest

Arrays.asList(new Stack[52]) ein Array in eine Liste zu wickeln.

könnte ich jour Fehler anywany reproduzieren .. :(perchaps es ist, weil eine andere Warnung/Errorlevel-Set.

+0

Mit einem Array kann ich die Anzahl der darin enthaltenen Stacks begrenzen, Da die Liste eine Schnittstelle ist, sind alle Implementierungen der Liste nicht genau das, wofür ich sie brauche. –

+0

siehe org.apache.commons.collections.list.FixedSizeList – KitsuneYMG

2

Sie Folgendes tun können, wenn dies Sie einen Compiler "ungeprüft" Warnung gibt.

Stack<Card>[] cards = (Stack<Card>[]) new Stack[52]; 
+0

Wow, danke, dass du mich daran erinnerst, dass ich Generika hasse :) Um ehrlich zu sein, Code nur hässlich zu machen, dass deine dumme IDE sich nicht beschwert, ist kein guter Grund dafür. –

+0

Danke für die Antwort, aber ich möchte sie nicht so werfen müssen, wie sie herauskommen. Muss einer engen Spezifikation folgen, die es nicht erlaubt, dass sie ausgetrickst wird. –

+0

@Nobert Hartl: Es ist nicht die IDE, es ist die Java Language Specification! –

0

Es ist mit Typ Löschung zu tun. Grundsätzlich ist die generischen Typen existieren nur bei der Kompilierung und haben keine Präsenz während der Laufzeit

bei this forum post für eine bessere Erklärung zu suchen.

6

Joshua Bloch beschreibt dieses Problem hervorragend in Effektive Java, zweite Ausgabe. Check out the relevant section on Google Book Search.

Der Ratschlag, den er anbietet, ist Listen zu Arrays vorzuziehen. Code könnte dann in etwa so aussehen:

List<Stack<Card>> cards = new ArrayList<Stack<Card>>(); 
1
Stack<Card>[] decks = new Stack[9];  // Declare 
Card c = decks[5].pop();     // This compiles - java 'knows' the type 
Integer i = decks[4].pop();    // This will not compile