Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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?
import java.util.*;
public class MeineKlasse {
// nummer
public int nummer;
// links
public List<String> links = new Stack<String>();
public MeineKlasse(int myNummer, List<String> myLinks) {
this.nummer = myNummer;
this.links = myLinks;
}
public int getNummer() {
return nummer;
}
public List<String> getLinks() {
return links;
}
}
mit dem Attribut links von Datentyp Stack
nun wollte ich viele Objekte der Typ MeineKlasse in einem Array speichern. Mein Versuch
Java:
import java.util.*;
public class MeineKlasseTest {
static MeineKlasse [] arrayMeineKlasse = new MeineKlasse [] {
new MeineKlasse(2, new Stack("DTJ", "KDZ", "TXZ")),
new MeineKlasse(3, new Stack("sDTJ", "TsXZ")),
};
}
Tags? :lol:
Wieso willst du denn einen Stack verwenden?
Ein Stack ist eine last-in-first-out (LIFO) Struktur.
Siehe [url=http://docs.oracle.com/javase/8/docs/api/java/util/Stack.html]Stack (Java Platform SE 8 )[/url]
Eine Möglichkeit wäre sich eine eigene Stack Klasse zu schreiben bzw. die vorhandene zu erweitern. z.B. so:
Java:
import java.util.Arrays;
import java.util.List;
import java.util.Stack;
public class EnhancedStack<E> extends Stack<E>
{
private static final long serialVersionUID = -3427433642132666028L;
public EnhancedStack()
{
}
@SafeVarargs
public EnhancedStack(E... objects)
{
pushAll(objects);
}
public EnhancedStack(List<E> objects)
{
pushAll(objects);
}
@SafeVarargs
public final void pushAll(E... objects)
{
List<E> objectsList = Arrays.asList(objects);
pushAll(objectsList);
}
public void pushAll(List<E> objects)
{
if(objects == null)
return;
for(E object : objects)
{
push(object);
}
}
}
Kann dann so benutzt werden:
Java:
Stack<String> stack = new EnhancedStack<String>("Stack 1", "Stack 2");
System.out.println(stack.pop());
System.out.println(stack.pop());
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!
static void m(List<String>... stringLists) {
Object[] array = stringLists;
List<Integer> tmpList = Arrays.asList(42);
array[0] = tmpList; // Semantically invalid, but compiles without warnings
String 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:
Java:
new EnhancedStack<String>(new String[]{"Stack 1", "Stack 2"});