Casting in Java eingeben [duplizieren]

8
%Vor%

In diesem Code wird beim Konvertieren von -x des primitiven Typs int in einen Wrapper-Typ Integer ein Kompilierungsfehler erzeugt: illegal start of type .

%Vor%

Es erfordert ein paar geschweifte Klammern um -x like Integer c=(Integer)(-x);

Der folgende Ausdruck wird jedoch gut kompiliert.

%Vor%

Warum benötigt dieses nicht ein Paar Klammern um -a wie im vorhergehenden Ausdruck?

    
Tiny 09.10.2012, 21:33
quelle

3 Antworten

11

Der Compiler denkt, dass Sie in dem Ausdruck (Integer)-x versuchen, x von einer Variablen namens Integer zu subtrahieren, daher der Fehler, da keine solche Variable definiert ist. (int)-x funktioniert, weil int ein reserviertes Schlüsselwort für einen primitiven Typ ist und nicht als Variablenname verwendet werden kann. Daher kann der Compiler ableiten, dass Sie versuchen zu wirken, nicht zu subtrahieren.

    
arshajii 09.10.2012, 21:37
quelle
5

Die Antwort finden Sie Java-Grammatik prüfen :

%Vor%

Dies sagt Ihnen, dass Sie einen Cast-Ausdruck wie (int) -x; verwenden können, da int ein primitiver Typ ist und Sie daher einen unären Ausdruck haben können, der diesem folgt. Wenn Sie jedoch ein Objekt verwenden, dann ist das ein ReferenceType und das einzige, was einem ReferenceType folgt, ist UnaryExpressionNotPlusMinus , die Dinge wie -x oder +x nicht enthält:

%Vor%

Der Grund für dieses Verbot ist, dass Integer von sich aus als ein Bezeichner interpretiert werden könnte, was zu Mehrdeutigkeit führt. int kann nicht als identifiziert interpretiert werden, da es sich um ein reserviertes Wort handelt. Um diese Mehrdeutigkeit aufzulösen, müssen Sie den unären Ausdruck in Klammern einschließen.

    
Vivin Paliath 09.10.2012 21:45
quelle
1

Sie können primitiv nicht in Klasse und umgekehrt konvertieren.

Sie können Primitive in andere Primitive umwandeln. In diesem Fall kann die Wertgenauigkeit verloren gehen. Zum Beispiel, wenn Sie lange nach int werfen.

Sie können das Objekt auch in einen anderen Typ umwandeln.

Die Zuweisung primitiver Wrapper-Typen zu Primitiven ist seit java 1.5 durch Autoboxing erlaubt und kann verwirren. Dies ist nur ein Compiler Zucker. Wenn Sie

sagen

Integer a = 5; Compiler übersetzt es in Integer a = new Integer(5);

Wenn Sie dann sagen

int b = a; Sie sagen wirklich int b = a.intValue();

Leider arbeiten Operatoren wie +, - usw. nicht mit primitiven Wrappern. Nur Primitive unterstützen sie. Also, du kannst nicht -a sagen. Sie müssen (-1)*a.intValue() sagen. Jetzt kann dieser Wert entweder int oder Integer Variable zugewiesen werden: Autoboxing wird den Job erledigen.

    
AlexR 09.10.2012 21:42
quelle