Wie bereits in den Kommentaren erwähnt, wenn Sie
tun %Vor% Long
l1
wird automatisch auf den primitiven Typ long
entpackt. Der Vergleich ist also zwischen long
und int
.
Im zweiten Fall l1.longValue()
gibt den long
-Wert des vom Objekt Long
dargestellten Long
als Primitiv zurück, so dass der Vergleich wieder zwischen long
und int
erfolgt. Beantworten Sie Ihren Kommentar , werfen Sie einen Blick auf Was ist der Hauptunterschied zwischen dem primitiven Typ und der Wrapper-Klasse?
Der Link in den Kommentaren zu Autoboxing deckt dieses Thema sehr gut ab.
Dieses Verhalten wird durch Erweitern und Boxen erklärt.
Im ersten Beispiel
%Vor%Was passiert, ist wie folgt:
1: Der Compiler merkt, dass Sie einen Wrapper (Long) mit einem primitiven Wert (int) vergleichen, so dass er das Primitiv einbezieht, was zu folgendem Ergebnis führt:
if (l1 == new Integer(2))
da 2 ein int ist (es fehlt das 'L' am Ende).
2: Der Compiler merkt jetzt, dass wir ein Long mit einem Integer vergleichen, so dass es den Integer zu einem Long erweitert, was zu folgendem Ergebnis führt:
if (l1 == new Long(new Integer(2))
3: Jetzt vergleichen wir zwei Longs.
Der andere Fall ist einfacher, hier ist das Ergebnis einfach:
if (2L == 2)
vergleicht die primitiven Werte, die erlaubt sind, obwohl sie unterschiedliche Typen sind.
Tags und Links java