Java erlaubt, java.lang.Short, aber nicht java.lang.Integer Byte zuzuweisen

8
%Vor%

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.

    
Pawel Mercik 13.08.2014, 17:27
quelle

1 Antwort

6

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.

    
rgettman 13.08.2014 18:22
quelle