Im folgenden Beispiel
int i = -128;
Integer i2 = (Integer) i; // compiles
Integer i3 = (Integer) -128; /*** Doesn't compile ***/
Integer i4 = (Integer) (int) -128; // compiles
Integer i4 = -128; // compiles
Integer i5 = (int) -128; // compiles
Integer i6 = (Integer) (-128); // compiles
Integer i7 = (Integer) 0-128; // compiles
Ich kann nicht werfen -128
mit , (Integer)
aber ich warf kann (int) -128
.
Ich dachte immer, -128
es wäre von int
Typ und das Casting mit (int)
sollte überflüssig sein.
Der Fehler in der Zeile mit i3
ist
cannot find symbol variable Integer
Ich habe dies mit Java 6 Update 29 und Java 7 Update 1 versucht.
EDIT: Sie erhalten das gleiche Verhalten mit +128
statt -128
. Es scheint eine Verwechslung zwischen unären und binären Operatoren zu sein.
Integer i = -128;
Dies sollte jedoch kompiliert werden.Integer i3 = (Integer) (-128);
entspricht aber.Expression expected
wo derInteger
ist.Antworten:
Der Compiler versucht , subtrahieren
128
von(Integer)
anstelle von Gießen-128
aufInteger
. Fügen Sie hinzu()
, um es zu behebenLaut BoltClock in den Kommentaren
int
funktioniert die Besetzung wie vorgesehen, da es sich um ein reserviertes Wort handelt und daher nicht als Kennung interpretiert werden kann, was für mich sinnvoll ist.Und Bringer128 fand die JLS-Referenz 15.16 .
Wie Sie sehen können, erfordert das Umwandeln in einen primitiven Typ eine beliebige
UnaryExpression
, während das Umwandeln in einen Referenztyp a erfordertUnaryExpressionNotPlusMinus
. Diese werden unmittelbar vor der CastExpression in JLS 15.15 definiert .quelle
int
um ein Schlüsselwort in Java handelt, aberInteger
nicht. Daint
es sich um ein Schlüsselwort handelt, können Sie es nicht als Bezeichner für eine Variable oder eine Klasse verwenden, sodass nur noch eine Typumwandlung möglich ist. Das würde es erklären.Ich habe die JLS-Referenz gefunden. 15.16 .
Wie Sie sehen können, erfordert das Umwandeln in einen primitiven Typ eine beliebige
UnaryExpression
, während das Umwandeln in einen Referenztyp a erfordertUnaryExpressionNotPlusMinus
. Diese werden unmittelbar vor der CastExpression in JLS 15.15 definiert .Sie müssen entweder die Besetzung in einen primitiven Typ ändern:
Oder Sie können den Ausdruck rechts von der Besetzung in einen unären Plus-Minus-Ausdruck ändern:
quelle
Der Compiler interpretiert den
-
Operator mit zwei Argumenten minus, dh er versucht, 128 von einer anderen benannten Zahl zu subtrahierenInteger
, aber es gibt keine solche Variable im Gültigkeitsbereich.Dies kompiliert:
quelle
(int)
einen Unterschied macht.Dies hat möglicherweise mit der Syntaxanalyse zu tun. Beachte das
funktioniert gut.
Im Allgemeinen sollten Sie nicht in die Integer-Klasse umwandeln. Dies beinhaltet etwas, das als Auto-Boxing bezeichnet wird, und kann einige subtile Fehler in Ihrem Code verursachen. Die bevorzugte Methode, um das zu tun, was Sie wollen, ist:
quelle
for (int i in Collection<Integer>)
b / c befindet sich die NPE an einem absolut unerwarteten Ort. Ich verwende eigentlich keine Ganzzahl mit Autoboxing, da der Cache-Bereich klein ist (obwohl er mit der Option XX erweitert werden kann), habe aber eine Klasse namens IntegerProvider (seit 1.1), um genau das Gleiche zu tun. Verwenden von Map (beliebig aus java.util) Ganzzahl-> Alles ist normalerweise ein Leistungseinbruch, es sei denn, es wird für triviale Fälle verwendet und fast immer gibt es eine bessere Lösung.Es analysiert es als
Integer <minus operator> 128
und findet die Variable nichtInteger
. Sie müssen die-128
in Klammern setzen:quelle
Das Problem ist, dass der
-
Compiler es als Operator sieht.quelle
Zeile 3 wird so interpretiert, als würden Sie versuchen, 128 vom Ausdruck in der Klammer abzuleiten, und der Ausdruck in der Klammer ist nicht und Ausdruck vom Typ int (behandelt das '-' als '-' Operator). Wenn Sie den Ausdruck ändern in:
dann wird der Compiler verstehen, dass '-' das unäre Minus ist, das eine negative ganze Zahl anzeigt.
quelle
Der C # -Compiler hat das gleiche Verhalten. Es gibt einen besseren Hinweis, warum es nicht kompiliert werden kann:
quelle