Bestimmte Funktionalität des Compilers verwirrt mich (Oracle JDK 1.7 mit Eclipse).Java - warum wird char implizit in ein Byte (und kurzes) primitiv umgewandelt, wenn nicht?
So habe ich dieses Buch, das besagt, dass Char primitive explizit auf kurze und Byte umgewandelt werden muss und dies alles Sinn macht, da die zulässigen Bereiche der Datentypen nicht überlappen.
Mit anderen Worten unter Code funktioniert (aber wäre ohne den expliziten Typen wirft nicht):
char c = '&';
byte b = (byte)c;
short s = (short)c;
Druck b oder s zeigt korrekt die Nummer 38, die das numerische Äquivalent (&) in Unicode.
Was bringt mich zu meiner eigentlichen Frage. Warum funktioniert das Folgende auch?
byte bc = '&';
short sc = '&';
System.out.println(bc); // Correctly displays number 38 on the console
System.out.println(sc); // Correctly displays number 38 on the console
Jetzt würde ich sicherlich verstehen, die folgende (was auch funktioniert):
byte bt = (byte)'&';
System.out.println(bt); // Correctly displays number 38 on the console
Aber diese no-Compiler-Warnung char Byte (und kurz) "Sneak conversion" scheint nicht direkt zu mir.
Kann jemand erklären, warum dies erlaubt ist?
Könnte der Grund in der Interpretation der '<char>'
selbst sein, so dass es tatsächlich nie zu einem Char primitiven Zustand, sondern wird als numerischer Wert (oktal oder hexadezimal etc.) behandelt?
Einfach ausgedrückt, kann der Compiler bestimmen, ob eine Konstante sicher eingegrenzt werden kann. Es wird einen kompilierten Zeitfehler erzeugen, wenn die Präzision verloren geht, versuchen Sie dies zum Vergleich: byte b = '\ u20AC'; – Durandal