für List gibt es Arrays.asList() und was gibt es für Set und Stack. Wie kann man viele Klassenobjekte, deren Komponenten aus Set und Stack bestehen, in einem Array speichern?
Tags?:lol:Wieso willst du denn einen Stack verwenden?EinStack ist eine last-in-first-out (LIFO)Struktur.Siehe[url=http://docs.oracle.com/javase/8/docs/api/java/util/Stack.html]Stack(JavaPlatformSE8)[/url]
Zu beachten ist allerdings in der neuen Stack Klasse der Konstruktor bzw. die final Methode die mit der Annotation @SafeVarargs versehen wurde. Ohne diese Annotation bekommt man folgende Warnung:
"Type safety: Potential heap pollution via varargs parameter objects"
Bisher hatte ich diese Warning noch nie gesehen. Durch Recherchen im Netz denke ich, dass diese "Heap Pollution" eine potentielle Ursache für ClassCastExceptions sein kann. Da man anscheinend durch die Verwendung von VarArgs(die "..." Notation) und Generics kompillierbaren Code erzeugen kann, der aber zur Laufzeit die ClassCastException werfen kann.
In den Docs zu der SafeVarargs Annotation gibt es folgendes Beispiel:
Java:
@SafeVarargs// Not actually safe!staticvoidm(List<String>... stringLists){Object[] array = stringLists;List<Integer> tmpList =Arrays.asList(42);
array[0]= tmpList;// Semantically invalid, but compiles without warningsString s = stringLists[0].get(0);// Oh no, ClassCastException at runtime!}
Da ich den erklärenden text der Docs leider nicht so ganz verstehe, bin ich mir bei der Implementierung der EnhancedStack Klasse nicht so sicher. Aber, so wie ich das meine zu verstehen, sollte es in meiner Stack Klasse zu keiner "Heap Pollution" kommen, da meiner Meinung nach, keine unsicheren Operationen durchgeführt werden.
In anderen Worten: Es kann doch eigentlich kein anderer Klassentyp im Stack vorhanden sein, als per Generic (das < E >) definiert. Oder?
Zum Abschluss: Der Code scheint so zu funktionieren, wie erwartet/gewollt. Ich wäre aber dankbar dafür, wenn sich ein paar Experten fänden, die da einmal drüber schauen. Es würde mich nämlich interessieren, ob meine Vermutungen so richtig sind.
P.S. Man könnte natürlich das E... objects jeweils durch E[] objects ersetzen. Nur könnte man denn nur noch Arrays übergeben. z.B. so: