Erweiterung und Boxen von Java-Primitiven.
Ich weiß, dass es nicht möglich ist, eine Wrapper-Klasse von einer zur anderen zu erweitern, da sie nicht aus der gleichen Erbschaft stammen. Warum ist es jedoch nicht möglich, ein Primitiv auf einen anderen Primitivtyp zu erweitern und das erweiterte Primitiv zu autoboxieren?
Da ein Byteargument an eine Methode übergeben werden kann, die einen int erwartet, warum kann das Byte im folgenden Beispiel auf einen int erweitert und dann mit einer Ganzzahl verknüpft werden?
%Vor% Im obigen Beispiel wird goInt(b)
vom Compiler akzeptiert, aber goInteger(b)
wird abgelehnt.
Die Java-Sprache unterstützt nur ein gewisses Maß an Sorglosigkeit.
Ich glaube, dass Autoboxing hinzugefügt wurde, um Entwickler Sorglosigkeit zu unterstützen. Speziell in Situationen wie diesem: "Ich brauche einen Integer als Parameter für die Methode, die ich aufrufen möchte, aber ich habe einen int. Irgendwie erscheint mir nie ein neuer Integer (int), stattdessen sende ich einfach einen int und der Java-Compiler wird den neuen Aufruf von Integer () für mich ausführen. Danke java carelessness support group! "
Die Leute, die Autoboxing entwarfen, waren bereit, eine Stufe der Sorglosigkeit (int = & gt; Integer und zurück) zu unterstützen, waren aber nicht gewillt, die automatische Umwandlung kleinerer primitiver Typen in größere primitive Typen in Verbindung mit automatischer Erzeugung und Extrahierung von primitiven zu unterstützen Geben Sie Wrapper-Klassen ein. Ich vermute, dass die Entscheidungsmatrix dafür etwas größer ist als die Entscheidungsmatrix für das aktuelle Autoboxing-Schema.
Warum? Weil Boxen / Autoboxing nur ein Teil des Zuckers ist und kein neues Typsystem. Es ist schlecht entworfen und verursacht Ärger mindestens so oft wie es Dinge vereinfacht.
Aber hier sind einige Problemumgehungen für Ihren Kompilierungsfehler:
%Vor%In Java ist Boxen + Erweiterung erlaubt, aber nicht Erweiterung + Boxen . Damit goInteger akzeptiert wird, ist zuerst die Erweiterung des primitiven Datentyps (byte - & gt; int) erforderlich, was ok und dann Boxing ist (int - & gt; Integer). Finden Sie die 5 goldenen Regeln von Erweiterung, Boxen und Vararg:
- Primitive Verbreiterung & gt; Boxen & gt; Varargs.
- Erweiterung und Boxen (WB) nicht erlaubt.
- Boxen und Verbreiterung (BW) erlaubt.
- Beim Überladen können Widening + Vararg und Boxing + Vararg nur in einer sich gegenseitig ausschließenden Weise verwendet werden, d. h. nicht zusammen.
- Erweiterung zwischen Wrapper-Klassen nicht erlaubt
Ich hoffe, das wird dir helfen. Mit freundlichen Grüßen Sudipta Deb.
Wenn wir zu viele magische Conversions zulassen, wird das sehr verwirrend.
Die bestehenden Konvertierungsregeln sind schon mehr, als die Leute verstehen wollen. Sogar die Sprachspezifikation hat es falsch gemacht! Sehen Sie dieses lustige Beispiel Java-Casting: ist der Compiler falsch, oder ist die Sprachspezifikation falsch oder liege ich falsch?
Tags und Links java wrapper primitive-types boxing autoboxing