2010-09-09 3 views
5

Ich verstehe, dass der folgende Code nichtAutoboxing/Erweiterung erfolgt in Kurz a = 3, aber nicht in Float a = 3;

Float a=3 

weil sein übersetzt als Float a = Integer.valueOf (3) arbeiten. Wir haben eine Float-Referenz auf der LHS und ein Integer-Objekt auf der RHS, die nicht kompatibel ist. Aber:

1.

 `Short a=3;` 

Dies funktioniert, wenn auch hier wieder, werden wir eine Kurzreferenz auf der LHS haben und ein Integer-Objekt auf der RHS.

2.

Float a=(Float) 3

Wenn wir 3 nicht typecasted hätte, wäre es als Integer.valueOf übersetzt wurden (3). Wird es nun als Float.valueOf (3) übersetzt?

+0

Haben Sie einen Java-Compiler? Wenn ja, können Sie das versuchen. – DJClayworth

Antwort

0

Wenn Sie versuchen, eine Variable mit einem Wert zu initialisieren, der größer ist als sie annehmen kann (unabhängig von der numerischen Form des Werts), gibt der Compiler eine Fehlermeldung aus.

char c = 0xffff; // max char hex value 
byte b = 0x7f; // max byte hex value 
short s = 0x7fff; // max short hex value 

Beachten Sie im obigen Code die maximal möglichen Hexadezimalwerte für char, byte und short. Wenn Sie diese Werte überschreiten, wird der Compiler automatisch den Wert zu einem int machen und Ihnen sagen, dass Sie eine Eingrenzung für die Zuweisung benötigen. Du wirst wissen, dass du über die Linie gegangen bist.

Also in Ihrem Fall Short s = 3 wird tatsächlich und funktioniert. (ValueOf Methoden verwendet werden, nicht als Autoboxing, weshalb moderne IDEs Optionen Flagge als Fehler dieser Autoboxing und wir können sie mit der valueOf Methode für eine bessere mgmt Speicher ersetzen)

Im zweiten Fall wird Float a=(Float) 3 werden Float.valueOf(3)

+0

Danke. Sehr deutlich. Kannst du dann bestätigen, dass "Float a = 3 nicht funktioniert, da Java keine Erweiterung durch Autoboxen erlaubt". Außerdem bedeutet Autoboxing nicht nur, dass der entsprechende Wrapper-Konstruktor für die LHS aufgerufen wird. Wenn das der Fall wäre, hätte Float a = 3 funktioniert. Was passiert, ist, dass vor dem Autoboxing eine verengende Konvertierung stattfinden muss, um den primitiven Typ gleich dem primitiven Typ des Wrappers zu machen, und dann nur das Autoboxing stattfinden würde. Bin ich hier? – Daud

1

Die Kurzform ist:

Float a=3.0f; 

Für Doppeltyp:

Double b=3.0; 
2

Wenn Ihre Frage ist: „Warum Float f = 3; nicht kompiliert, aber Short s = 3; tut? ", dann ist die Antwort:

der Java-Compiler macht einige spezielle Arbeit an Integer-Konstanten, um sie mit der linken Seite zu passen: es findet den am besten geeigneten Typ und verwendet es. So

Short s = 3; 

wird kompiliert

Short s = Short.valueOf(3); 

Wesentlichen die gleiche Magie passiert, wenn man

short s = 3; 

schreiben Aber dies geschieht nur für Integers, und nicht für Gleitkommawerte .

0

Es gibt keine Möglichkeit, Kurz- und Byte-Konstanten anzugeben. Der Compiler ermöglicht also die transparente Umsetzung von int-Konstanten. Es gibt Float-Konstanten in Java, so dass implizite Übersetzungen nicht unterstützt werden.Wenn Sie einen Float/Float möchten, schlage ich vor, dass Sie eine Float-Konstante verwenden.

Byte b = 3; 
Short s = 3; 
Integer i = 3; 
Long l = 3L; 
Float f = 3f; 
Double d = 3d; 
Verwandte Themen