java: Verwendung von clone() und was über die cast-check
Diesem code:
class RawStringIterator {
java.util.Stack<State> stateStack = new java.util.Stack<State>();
RawStringIterator(RawStringIterator i) {
stateStack = (java.util.Stack<State>) i.stateStack.clone();
}
/* ... */
}
gibt mir diese Warnung:
Type safety: Unchecked cast from Object to Stack<Utils.OperatorTree.RawStringIterator.State>
Ich denke, ich kann die Warnung ignorieren hier. Aber ich Frage mich, über wie zu verwenden clone()
im Allgemeinen? Muss ich immer einen @SuppressWarnings("unchecked")
jedes mal, wenn ich clone()
? Oder sollte ich immer das tun, völlig überflüssig extra prüfen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie die Wahl haben, das beste ist, nicht zu implementieren /benutzen
clone()
überhaupt, weil es ist eine kaputte API. Nur umsetzen /verwenden einen copy-Konstruktor statt.Wenn aus irgendeinem Grund müssen Sie
clone()
aber ändern kann ist seine Umsetzung, sollten DeklarationStack<T>.clone()
zurückStack<T>
stattObject
- kovariante Rückgabetypen sind legal, da Java5.Update: wenn die
Stack
in Fragejava.util.Stack
betrachten seine Javadoc:Werden und z.B.
ArrayDeque
bietet eine copy-Konstruktor.Stack<T>
istjava.util.Stack<T>
hier. Ich kann also nicht wirklich ändern, eine Erklärung gibt.Gibt es keine Möglichkeit zu vermeiden, die hier gewirkt.
clone()
zurückObject
, wenn esjava.util.Stack
ist es nicht mit der co-Variante Rückgabetypen.Ist dies nicht
java.util.Stack
, dann nicht implementierenclone()
- es ist wirklich schwer, es richtig zu machen. Machen Sie einen copy-Konstruktor statt.clone()
- Effective Java 2nd Ed. Item 11 zeigt explizite Beispiele.java.util.Stack
keinen Kopie-Konstruktor. Sonst hätte ich es verwendet.Haben Sie sehr wenig Auswahl, aber es zu ignorieren.
Ist zwar nicht direkt relevant ist (weil Sie nicht das schreiben eines
clone()
- Methode), wird dieser Eintrag in der Java Generics FAQ macht gut Lesen (wie funktioniert das ganze FAQ!)Ja, müssen Sie explizit die Warnungen unterdrücken, jedes mal, wenn Sie
clone()
.Dies ist einer der Gründe, die Sie vielleicht lieber mit copy-Konstruktoren statt
clone()
, wenn verfügbar.Durch die Art und Weise in Ihrem code, wenn die
RawStringIterator(RawStringIterator i)
- Konstruktor verwendet wird, der ersten Initialisierung desstateStack
ist unnötig:Möchten Sie vielleicht zu entfernen.