2016-06-23 9 views
2

Zuweisung Ich sehe keinen klaren Grund dies geschieht ..int wörtlich nach Long in Java

public class wrappers 
{ 
    public static void main(String []args) 
    { 
     short s1=32767; // (primitive) works fine without compile error 
     short s2=32768; fails as this is beyond short's range 


     Short s3=32767; //(wrapper) works fine without compile error 
     Short s4=32768; fails as this is beyond short's range 

     long l1 =34 // (wrapper)works fine (with_in_range) 


     Long l2 =34 // fails, without 34L (with_in_range) 

    } 

Ich weiß, dass, wenn Sie int wörtliche für Wrapper-Klassen zuweisen, valueOf() genannt wird;

während für Short(Wrapper) scheint dies zu funktionieren, aber für Long(wrapper) über Zuweisungen im Code fehlgeschlagen.

Gibt es Regeln für die Zuweisung dieser Wrapper-Klassen?

+0

gefunden Sie einen schönen Ecke Fall. Ich glaube, das 'Short s4 = 32767' sollte auch nicht funktionieren. Wie auch immer, Sie können den 'Long'-Fall wie folgt beheben:' Long l1 = 12L; // Kapital L'. Für den Rekord, der Begriff für [Autoboxing] (https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html), können Sie dafür googeln. –

+0

Ja, es gibt Regeln. Sie werden als [Java Language Specifications] (https://docs.oracle.com/javase/specs/) bezeichnet. – Andreas

+0

Sie geben die Werte nicht an. genau wie 'int a = 100.1' wird nicht kompiliert, wie oben beschrieben. –

Antwort

5

auf Jons Antwort zu erweitern, die Regel, dass Short s3=32767 arbeiten können ist auch in der JLS angegeben. Es gibt eine spezielle Regel für die Zuweisung von konstanten Ausdrücken:

5.2. Assignment Contexts
...

Darüber hinaus, wenn der Ausdruck eine konstanter Ausdruck ist (§15.28) Typenbyte, short, char oder int:

  • eine Verengung primitive Umwandlung verwendet werden können, wenn der Typ der Variablen ist byte, kurz oder char, und der Wert der Konstante Ausdruck ist im Typ der Variablen darstellbar.

    1. Byte und der Wert des konstanten Ausdrucks ist in dem Typ-Byte darstellbaren:

    2. eine Verengung primitive Umwandlung durch eine Umwandlungs boxing gefolgt kann der Variablen, wenn der Typ ist verwendet werden.

    3. Kurz und der Wert des konstanten Ausdrucks ist im Typ short darstellbar.

    4. Das Zeichen und der Wert des konstanten Ausdrucks können im Typ char dargestellt werden.

+0

danke. Sehr elegante Erklärung, jetzt weiß ich, warum das passiert – viru

5

gibt es irgendwelche Regeln dieser Wrapper-Klassen Zuweisungen regeln

Ja - die Regeln des JLS. Sie gibt widening primitive conversions (5.1.2) und boxing conversions (5.1.7) an.

Die Liste der Boxen Konvertierungen beinhaltet:

  • Von Typ intInteger
  • Vom Typ long eingeben Long

So möchten Sie eine erweiternde Konvertierung gefolgt eingeben, indem eine Box-Konvertierung. Sie versuchen, dies in einem Zuordnung Kontext (5.2) zu tun, in dem es heißt:

  • Identitätsumwandlung (§5.1.1:

    Zuordnung Kontexte der Verwendung von einem der folgenden erlauben)

  • eine Verbreiterung primitive Umwandlung (§5.1.2)
  • eine Verbreiterung Referenzumwandlung (§5.1.5)
  • eine Box-Umwandlung (§5.1.7) gegebenenfalls durch eine Verbreiterung Bezugnahme gefolgt con Version
  • eine Unboxing-Konvertierung (§5.1.8), optional gefolgt von einer Erweiterung der Grundelementkonvertierung.

Beachten Sie, dass diese Liste nicht nicht eine Verbreiterung primitive Umwandlung von einer Box-Umwandlung gefolgt ist. Das Gegenteil ist in Ordnung:

Integer x = 10; 
long y = x; // Unboxing followed by widening primitive 

Auf dem Gesicht von ihm, es wie die Regeln klingt könnte geschrieben wurden, um eine Verbreiterung primitive Umwandlung von einer Box-Umwandlung gefolgt zu ermöglichen, mit Regeln, so dass Object x = 10; bevorzugt Boxen als Integer anstatt 10 ... aber Typkonvertierungsregeln sind sehr schwer zu Recht, mit vielen Feinheiten. Ich wäre nicht überrascht, wenn sich herausstellen würde, dass es einige bizarre Situationen gibt, in denen es große Probleme verursachen würde.

Der Grund für die Umstellung auf Short Arbeiten zur weiteren Regeln in 5.2 Ursachen zurückzuführen ist:

Darüber hinaus, wenn der Ausdruck ein konstanter Ausdruck ist (§15.28) vom Typ byte, short, char oder int:

  • eine Verengung primitive Umwandlung verwendet werden kann, wenn der Typ der variablen byte ist, short oder char, und der Wert des konstanten Ausdrucks ist in der Art der variablen darstellbar.
  • eine Verengung primitive Umwandlung durch eine Umwandlungs boxing gefolgt kann verwendet werden, wenn der Typ der Variablen ist:
    • Byte und der Wert des konstanten Ausdrucks darstellbare in der Art byte. Der Wert des konstanten Ausdrucks kann im Typ short dargestellt werden.
    • Character und der Wert des konstanten Ausdrucks ist im Typ char darstellbar.

Im Fall von

Short s = 32767; 

gibt es eine Verengung primitive Umwandlung von einer Box-Umwandlung gefolgt, wie oben beschrieben.

+0

Sie sollten auch den Abschnitt, der eine verengende primitive Konvertierung gefolgt von einer Box-Konvertierung für die kurze S3 = 32767 zu erwähnen ; Fall. – user2357112

+0

Sie erklären nicht, warum das 'Short s3 = 32767' funktioniert, da das Literal' 32767' als 'int'-Literal definiert ist und daher fehlschlagen sollte. – Andreas

+0

@Andreas: Habe diesen zusätzlichen Teil hinzugefügt. –

0

Autoboxing ist nur zwischen dem Urtyp und ihre jeweiligen Wrapper-Klassen wie getan:

int Integer,

lang Lange,

Doppel Double und so weiter.

Java ermöglicht keine Konvertierung zwischen dem primitiven Typ int und dem Objekt Long. Allerdings erlaubt es die Konvertierung zwischen primitiven Typ int und long. Daher, wenn Sie benötigen einen int auf eine Variable vom Typ zuweisen lange Sie das Suffix l oder L hinzufügen müssen:

Long l2 =34L,