2015-11-23 9 views
7

Ich habe den folgenden Code in Java:Warum verursacht die Zuweisung einer kurzen Variablen zu einer Integer-Referenz einen Kompilierzeitfehler?

class Boxing 
    { 
     public static void main(String args[]) 
     { 
      short s = 10; 
      Integer iRef = s; 
     } 
    } 

Warum es einen Fehler bei der Zusammenstellung produziert? Wenn ich den short explizit in eine Ganzzahl im Ausdruck tippe, kompiliert er erfolgreich. Da ich eine Abkürzung in einem Ausdruck verwende, ist das nicht der Typ von dem, der standardmäßig eine ganze Zahl sein soll, ohne den expliziten Fall zu erfordern?

+0

Ich würde 'int iRef = s' tun. –

+4

Das ist nicht meine Frage. Meine Frage ist, warum Integer iRef = s nicht funktioniert. –

Antwort

12

Sie möchten hier zwei Dinge haben: Verbreitern und Auto-Boxen.

Leider macht Java nur einen der beiden automatisch. Der Grund dafür ist höchstwahrscheinlich, dass das Autoboxing relativ spät eingeführt wurde (in Java5), und sie mussten vorsichtig sein, um den bestehenden Code nicht zu zerstören.

Sie können tun

int is = s; // widening 

Short sRef = s; // autoboxing 

Integer iRef = (int) s; // explicit widening, then autoboxing 
1

Boxing-Konvertierung konvertiert Ausdrücke des primitiven Typs in entsprechende Ausdrücke des Referenztyps. Insbesondere werden die folgenden neun Konvertierungen die Boxen Konvertierungen genannt:

Vom Typ boolean Typ Boolean

Von Typ Byte Byte

von Typ Typ kurz Typ Short

Vom Typ char to type Zeichen

Vom Typ int zum Typ Ganzzahl

Vom Typ lang Lange

Vom Typ float eingeben

Vom Typ double double eingeben

Von der Null-Typ Typ Float auf den Null-Typ

Referenz: Conversions and Promotions Reference

1

Heres die Dokumentation von JLS 5.1.7

Boxen Konvertierung wandelt Ausdrücke primitiver Typ Ausdrücke von Referenztyp entspricht.Insbesondere werden die folgenden neun Konvertierungen die Boxen Konvertierungen genannt: kurz Typ Short

Vom Typ char

Vom Typ boolean Typ Boolean

Von Typ Byte Byte

von Typ Typ zu Typ Zeichen

Vom Typ int Integer eingeben

Vom Typ lange lange Typ

Vom Typ float eingeben

Vom Typ Float Doppeldoppel

Von dem Null-Typ auf den Null-Typen ist

Basicly short-Integer die direkte Umwandlung geben nicht Teil der Autoboxing-Prozess von Java.

Das Autoboxing, wie oben beschrieben, ist nur in der Lage, den darstellenden primitiven Typ auf seine Wrapper-Klasse zu übertragen. Da dies nicht der Fall ist, wird ein Kompilierzeitfehler verursacht.

0

Im Code berücksichtigt.

class Boxing 
{ 
    public static void main(String args[]) 
    { 
     short s = 10; 
     Integer iRef = s; 
    } 
} 

Integer erweitert java.lang.Number. Und java.lang.Short erweitert auch java.lang.Number. Aber Short und Integer sind nicht direkt verwandt, wenn Sie möchten, dass Sie das folgende Programm ausführen können.

class Boxing 
{ 
    public static void main(String args[]) 
    { 
     short s = 10; 
     Number iRef = s; 
    } 
} 

Es wird ausgeführt, ohne einen Fehler zu erzeugen.

Verwandte Themen