Mein IDE ( NetBeans ) -Typ überprüft meinen Collections
Code, während ich ihn eingebe. Aber warum muss ich dann das zurückgegebene Objekt von werfen Object.clone()
? Welches ist in Ordnung. Kein Schaden kein Foul. Aber ich verstehe es immer noch nicht.
Ist eine Typprüfung ohne Casting des zurückgegebenen Objekts Object.clone()
nicht möglich? Das generische Framework lässt mich glauben, dass die IDE den Typ der Objektreferenzen auf der rechten Seite der Markierung " = " überprüfen könnte, ohne sie während des Tippens umzusetzen. Ich verstehe es nicht.
Nachtrag
Mein Anwendungsfall war nur, dass ich ein privates Calendar
Feld hatte, pubdate . Ich wollte schreiben:
Calendar getPubdate() {
return pubdate;
}
Es besteht jedoch die Gefahr, dass der Aufrufer mein Pubdate ändert , sodass ich eine Kopie zurücksende :
Calendar getPubdate() {
return (Calendar) pubdate.clone();
}
Dann fragte ich mich, warum ich besetzen musste pubdate.clone()
. Die Methodensignatur hat genau dort den Typ. NetBeans sollte dies herausfinden können. Und NetBeans schien etwas Ähnliches in Bezug auf zu tun Collections
.
MyObject
vonclone()
nichtObject
- dies entfernt das gesamte Problem. Es wird weiterhin empfohlen, niemalsclone()
Java (Effective Java Item # 11) zu verwenden.this.clone()
an einen Programmer-Gegenstand, besonders in der Nacht nach der Veröffentlichung von Di. Entschuldigung, aber ich muss diesen Kommentar schreiben. Warum kann Smart IDE nicht einfach alle Fehler für uns beheben? LOLAntworten:
Weil es zurückkehrt
Object
.Object.clone
ist nicht generisch.Wenn es Generika gegeben hätte, als sie
clone
entworfen wurden, hätte sie wahrscheinlich so ausgesehen (unter Verwendung des F-Bounded Polymorphism):Wenn Java eine MyType-Funktion hätte, würde sie möglicherweise so aussehen:
Generics gab es jedoch nicht, als
Object.clone
es entworfen wurde, und Java hat keine MyTypes. Daher müssen wir mit der typunabhängigen Version vonObject.clone
arbeiten.quelle
original
?Dies ist kein Merkmal einer IDE, sondern der Sprachdefinition.
Eine IDE hilft Ihnen dabei, eine Programmiersprache effizienter zu nutzen, und ändert die Semantik dieser Sprache nicht. Das bedeutet, dass ein Editor-Helfer möglicherweise automatisch eine Besetzung einfügt, wenn klar ist, welche Sie möchten, aber nicht einfach die Regeln der Sprache brechen und so tun kann, als wäre der Code, der nicht kompiliert wurde, gültig.
Bearbeiten Es ist richtig, dass eine IDE ihren eigenen Compiler bündeln kann, und tatsächlich tun viele genau das, z. B. für eine bessere Fehlerberichterstattung mit mehr Insiderinformationen in den partiellen Analysebaum. Es wäre jedoch eine sehr schlechte Idee, diesen internen Compiler eine andere Sprachsemantik als das offizielle SDK implementieren zu lassen, da dies bedeuten würde, dass Code, der in der Entwicklung arbeitet, bei der Installation in der Produktion auf mysteriöse Weise zu Fehlern führen kann. debuggbar!
quelle
Dies liegt an der Typensignatur der Object.clone-Methode. Die Typensignatur gibt an, dass die Methode ein Objekt vom Typ Object zurückgibt.
Die Sammlungen verwenden sogenannte generische Typen, um die Art des Castings automatisch zu ersetzen.
Also, wenn Sie diesen Code haben:
Der Compiler fügt die Casts für Sie hinter den Kulissen hinzu. Der Code wäre also tatsächlich:
quelle
Der Vollständigkeit halber sind seit Java 5 kovariante Rückgabetypen zulässig . Sie können also Folgendes schreiben:
Damit ist der folgende Code legal:
quelle