Programm kompiliert für Kurz, aber für Ganzzahlkompilierung fehlschlägt mit "inkompatiblen Typen" Nachricht.
Ich habe Schwierigkeiten, dieses Verhalten zu verstehen. Ich konnte nichts für dieses spezielle Szenario finden.
Ich habe versucht, dies mit einer größeren Gruppe von Zuordnungskontexten zu duplizieren:
%Vor% Die Zuweisung zu einem Integer
, aber auch zu einem Float
, einem Long
oder einem Double
ist ebenfalls ein Fehler.
Interessanterweise, wenn die ursprüngliche Deklaration von b
NICHT final
war, dann scheitert auch die Zuweisung zu Character
, a char
oder a Short
.
Abschnitt 5.2 der JLS wirft ein wenig Licht zum Thema Einsatzkontexte und ihre erlaubten Konversionen.
Zuordnungskontexte ermöglichen die Verwendung eines der folgenden Elemente:
eine Identitätskonvertierung (§5.1.1)
eine erweiterte primitive Konvertierung (§5.1.2)
eine Erweiterung der Referenzumwandlung (§5.1.5)
eine Box-Konvertierung (§5.1.7), optional gefolgt von einer erweiterten Referenzkonvertierung
eine Unboxing-Konvertierung (§5.1.8), optional gefolgt von einer erweiterten Grundelementkonvertierung.
Dies deckt alle Konvertierungen zu breiteren primitiven Variablen ab, die immer erlaubt sind, unabhängig davon, ob b
ist final
oder nicht. (Das gilt, wenn b
nicht negativ ist. In diesem Fall würde die Zuweisung zu einem unsignierten char
(oder Character
) fehlschlagen.) Fortsetzung:
Außerdem, wenn der Ausdruck ein konstanter Ausdruck (§15.28) vom Typ byte, short, char oder int ist:
Eine einschränkende Grundelementkonvertierung kann verwendet werden, wenn der Typ der Variablen byte, short oder char ist und der Wert des konstanten Ausdrucks im Typ der Variablen dargestellt werden kann.
Eine verengende primitive Konvertierung gefolgt von einer Box-Konvertierung kann verwendet werden, wenn der Typ der Variablen lautet:
Byte und der Wert des konstanten Ausdrucks ist im Typ Byte darstellbar.
Kurz und der Wert des konstanten Ausdrucks ist im Typ short darstellbar.
Zeichen und der Wert des konstanten Ausdrucks sind im Typ char darstellbar.
Da b
ist final
, ist der Ausdruck b
ein konstanter Ausdruck , der es erlaubt, vom int
konstanten Ausdruck 12
auf byte
,% zu reduzieren. co_de% oder char
und dann mit short
, Byte
oder Character
, aber seltsamerweise nicht mit Short
oder irgendetwas "über". Die einzige mögliche Erklärung, die ich mir vorstellen kann, ist, dass konstante Ausdrücke, die einer primitiven verengenden Konvertierung unterliegen, nicht speziell in Integer
, Integer
, Long
oder Float
konvertiert werden dürfen.
Wenn Double
nicht b
ist, dann ist die Eingrenzung durch Boxen nicht erlaubt, und ein nicht konstanter Ausdruck kann nicht von final
auf byte
entweder hochgestuft werden.
Tags und Links java type-conversion wrapper autoboxing