In diesem Code wird beim Konvertieren von -x
des primitiven Typs int
in einen Wrapper-Typ Integer
ein Kompilierungsfehler erzeugt: illegal start of type
.
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?
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.
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:
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.
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.
Tags und Links java type-conversion compiler-errors casting