Erweiterung und Boxen von Java-Primitiven

8

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.

    
ziggy 10.08.2011, 16:15
quelle

5 Antworten

6

Kurze Antwort

Die Java-Sprache unterstützt nur ein gewisses Maß an Sorglosigkeit.

Längere Antwort

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.

    
DwB 10.08.2011, 16:26
quelle
4

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%     
Sean Patrick Floyd 10.08.2011 16:23
quelle
1

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:

  
  1. Primitive Verbreiterung & gt; Boxen & gt; Varargs.
  2.   
  3. Erweiterung und Boxen (WB) nicht erlaubt.
  4.   
  5. Boxen und Verbreiterung (BW) erlaubt.
  6.   
  7. Beim Überladen können Widening + Vararg und Boxing + Vararg nur in einer sich gegenseitig ausschließenden Weise verwendet werden, d. h. nicht zusammen.
  8.   
  9. Erweiterung zwischen Wrapper-Klassen nicht erlaubt
  10.   

Ich hoffe, das wird dir helfen. Mit freundlichen Grüßen Sudipta Deb.

    
Sudipta Deb 10.05.2012 22:25
quelle
0

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?

    
irreputable 10.08.2011 20:03
quelle
0

Ich denke, die Reihenfolge ist ziemlich faszinierend. Ich machte den folgenden Spielplatz aus, um jede mögliche Kombination zu sehen. Das sind meine Funktionen:

%Vor%

Regeln:

%Vor%     
J. Doe 08.02.2018 09:27
quelle