2017-03-31 4 views
-1

Ich habe Verwirrung in Number Wrapper-Klasse in Java.Implizite Konvertierung in Wrapper-Klasse

Diese beiden Aufgaben aussehen symmetrisch - ein char wird Integer zugewiesen und ein int wird Character zugeordnet. Allerdings ist die erste Aufgabe

Integer i = 'a'; 

gibt Compilation Fehler, während die zweite Zuordnung

Character ch2 = 97; 

erlaubt. Warum?

+0

Wie erwarten Sie, dass der Compiler in der Lage ist, "a" in einen ganzzahligen Wert zu konvertieren? – ericbn

+0

@ericbn [So] (http://ideone.com/jvaWzh) Im Wesentlichen benutzt OP "a" als eine andere Art, '97' zu schreiben. Diese Frage ist überraschend schwierig. – dasblinkenlight

+0

@Stirios Delimanolis Dies ist nicht doppelt. – Mathur

Antwort

5

Obwohl int i = 'a' fehlerfrei funktioniert, ist das Konvertieren derselben in Integer nicht zulässig, da eine Box-Konvertierung erforderlich ist.

Java-Box Umwandlung definiert ist nur für acht Fälle:

  • Vom Typ booleanBoolean eingeben
  • Vom Typ byteByte
  • Vom Typ short eingeben Short
  • von Typ Typ char zu type Character
  • int Vom Typ Integer
  • Vom Typ long eingeben Long
  • Vom Typ float eingeben Float
  • Vom Typ double eingeben Double

eingeben Da 'a' ein char wörtlichen ist, Java nicht Konvertierung von char zu Integer zulassen: Ein Zeichenliteral ist immer vom Typ char.

Wenn Sie jedoch

Character ch2 = 97; 

Java-Compiler schreiben sieht, dass 97 im gültigen Bereich ist für char (dh 0..65535), so dass es 97 als char behandelt, nicht int und erlaubt die Boxen Umwandlung. Wenn Sie dasselbe mit einer außerhalb des Bereichs liegenden Konstante versuchen, wird ein Fehler ausgegeben:

Character ch3 = 65536; // error: incompatible types: int cannot be converted to Character 
+0

Vielen Dank für die Erklärung – Mathur

+0

Oh diese Top 1% ers, stehlen immer unseren Ruf ;-) ... aber kudos, du hast es zuerst gedacht ;-) ... darf das blinken Licht mit dir sein! Wenn Sie die Frage zulassen: Woher kommt Ihr Spitzname? – GhostCat

+0

@GhostCat Es kommt von [diesem Pre-Internet Meme] (https://en.wikipedia.org/wiki/Blinkenlights) in einer etwas anderen "Übersetzung": "ACHTUNG! Das Gerät ist nicht für gefingerpoken und mitengrabben. Ist einfach schnappen der spingenwerk, blasenfusen und korkenpoppen mit spitzenparken. Ist nicht für gewerkschaften durch das dummköpfe. Das rubbernecken sightseeren keepen Hände in das Taschen. Relaxen und vatch das blinkenlights! " – dasblinkenlight

3

Die Regeln für die Box-Umwandlungen können in der Java-Sprache Spec, Kapitel 5.1.7

Boxing conversion converts expressions of primitive type to corresponding expressions of reference type. Specifically, the following nine conversions are called the boxing conversions:

... gefolgt von einer Liste von gültig Konvertierungen von primitiven Typen verweisen Typen.

Der Punkt ist: in jedem Fall muss eine Umwandlung stattfinden.

Wenn Sie hatte

int a = '97' 

, die in Ordnung ist; wie das ist eine Erweiterung der Umwandlung (Abschnitt 5.12 in der JLS). Aber dieser Fall

Integer i = '97' 

ist nicht als "gültige" Konvertierung für Auto-Boxen aufgeführt. Mit anderen Worten: Die JLS lässt das nicht zu; und das tut der Compiler auch nicht. ...

0

Integer i = 'a' nur wickelt int i ='a'. Da 'a' kein int ist, wird ein Fehler ausgegeben.

Ebenso Character ch2 = 97 wraps char ch2 = 97. 97 ist jedoch ein gültiges Zeichen! Es repräsentiert das Zeichen "a". Beispiel:

System.out.println((char) 97); //Output: a 
0

Dies liegt daran, dass beim Setzen eines Zeichens auf eine ganze Zahl die ASCII-Codenummer zurückgegeben wird, die ein primitives int ist.