Class Cast Exception in Java: kann nicht gegossen werden
Könnte mir jemand sagen was ist der Fehler in diesem code?
public class Node<T> {
private int degree;
@SuppressWarnings("unchecked")
T[] keys ;
Node<T>[] children;
Node(int degree) {
System.out.println(degree);
this.degree = degree;
@SuppressWarnings("unchecked")
Node<T>[] children = (Node<T>[])new Object[degree * 2];
@SuppressWarnings("unchecked")
T[] keys = (T[])new Object[(degree * 2) - 1];
}
public static void main(String[] s) {
Node<Integer> a = new Node<Integer>(5);
}
}
Grundsätzlich möchte ich eine selbstreferentielle Art von Sache, die ein Objekt speichert ein array von eigenen Objekten. Ich bin immer diese Fehlermeldung
Exception in thread "main" java.lang.Classcastexception-Fehler: [Ljava.lang.Object; cannot be cast to [Baum.Knoten;
Baum ist mein Paket name.
- Als Allgemeine Regel gilt... Wenn es einen compile-Fehler, sollten Sie ändern Sie Ihre Philosophie. Auszutricksen die JVM ist wahrscheinlich zum Absturz zu bringen. Wenn es nicht abstürzt, wäre es nicht zu einem Kompilierfehler, es wäre eine Warnung statt.
- arrays und generics nicht auskommen sehr gut. verwenden ArrayList<T>, wenn Sie können.
- Nicht verwandt, aber Sie sollten zur Kenntnis nehmen, dass Sie die Erstellung von lokalen Variablen aufgerufen, die Kinder und die Schlüssel in den Konstruktor, nicht Initialisierung von Instanz-Variablen mit dem gleichen Namen. Wahrscheinlich nicht das, was Sie soll.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kann man nicht Typisiertes array. Sie haben, dies zu tun:
Und befassen sich mit der Tatsache, dass arrays sind nicht typisiert 🙁
Anstelle von arrays für Ihre Kinder und die Tasten verwenden
List<Node<T>>
undList<T>
(undArrayList
als die Umsetzung). Dieser Weg, Sie verstecken die Komplexität der array-Erstellung und Gießen innerhalb derArrayList
Klasse. (Es verwendet eineObject[]
auch, aber nur wandelt aufget()
und ähnliche Methoden, anstatt zu versuchen, eine generische array).Oder, da es aussieht, erstellen Sie eine Art Karte sowieso, verwenden Sie eine
Map<T, Node<T>>
für Schlüssel und Knoten (Sie haben keinen index-Zugriff dann, wenn).Können Sie dies tun:
Hier erstellen Sie ein Objekt-array und ein Objekt, nicht einen Knoten. Sollten Sie die Erstellung einer Knoten-array statt, d.h.
Haben Sie diesen gleichen Fehler zweimal in Ihrem code.
Können Sie nicht wirken, ein Objekt zu einem Knoten:
Entweder Sie denken es der falsche Weg: "Jedes Objekt könnte ein Knoten", wenn das einzige, was wahr ist, ist "Jeder Knoten ist ein Objekt", oder, sind Sie es gewohnt, auf C++ oder ähnliches, in denen du kannst einen void-Zeiger ist zu jedem anderen Zeiger.
Außerdem, Sie können keine arrays von generischen Typen. Sie müssen zum Beispiel erstellen Sie ein wrapper-Typ, sagen.
StringNode extends Node<String>
um zu speichern diese in einem array.Diesem snippet, zum Beispiel, stellt so gut:
new Node<T>[]
- kompilieren-Fehler "generic array creation".(Node<T>[])new Node<?>[]
(mit einer unchecked cast).