Java: warum erhalte ich die Fehlermeldung "Type mismatch: cannot convert int to byte"
Wenn Sie deklarieren von Variablen vom Typ byte oder short und versuchen, führen Sie arithmetische Operationen auf diesen, erhalten Sie die Fehlermeldung "Type mismatch: cannot convert int to short" (oder entsprechend "Type mismatch: cannot convert int to byte").
byte a = 23;
byte b = 34;
byte c = a + b;
In diesem Beispiel das compile-Fehler auf der Dritten Zeile.
- IIRC die JVM speichert Byte und Short als int-Werte, so gibt es in der Regel sehr wenig nutzen, um die Verwendung der beiden Datentypen. Natürlich, ich erkenne, dass du tust etwas weit komplexer als dein Beispiel und wahrscheinlich einen sehr guten Grund.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Obwohl die arithmetischen Operatoren definiert sind, arbeiten auf einem beliebigen numerischen Typ, gemäß der Java language specification (5.6.2 Binary Numeric Promotion), Operanden vom Typ byte und short werden automatisch gefördert int, bevor er übergab an die Betreiber.
Durchführen arithmetische Operationen auf Variablen vom Typ byte oder kurz ist, müssen Sie schließen Sie den Ausdruck in Klammern (in denen Operationen durchgeführt werden als Typ int), und dann warf Sie das Ergebnis zurück auf den gewünschten Typ.
Hier ist ein follow-on Frage an die echten Java-gurus: warum? Die Typen byte und short sind völlig in Ordnung, numerische Typen. Warum hat Java keine direkte arithmetische Operationen auf diesen Typen? (Die Antwort ist nicht "loss of precision", da es keinen ersichtlichen Grund zum konvertieren von int in den ersten Platz.)
Update: jrudolph deutet darauf hin, dass dieses Verhalten basiert auf den verfügbaren Vorgänge in der JVM-spezifisch, dass nur die voll - und Doppel-word-Operatoren implementiert werden. Damit die Betreiber auf bytes und shorts, Sie müssen konvertiert werden. int.
Die Antwort auf Ihre follow-up-Frage ist hier:
So, in deinem Beispiel
a
undb
sind beide in einemint
bevor übergeben wird der + - operator. Das Ergebnis der addition von zweiint
s zusammen ist auch eineint
. Versucht zu ordnen, dassint
zu einembyte
Wert, die den Fehler verursacht, weil es einen potenziellen Verlust von Präzision. Durch explizites casting das Ergebnis teilen Sie dem compiler "ich weiß, was ich Tue".Ich denke, die Sache ist, dass die JVM unterstützt nur zwei Typen von stack-Werte: word-size-und Doppel-word-Format.
Dann haben Sie sich wahrscheinlich entschieden, Sie müssten nur eine operation, die die arbeiten auf word-sized Integer auf dem stack. Also gibt es nur iadd, imul und damit auf bytecode-Ebene (und keine Operatoren für Byte und Short).
So erhalten Sie einen int-Wert als Ergebnis dieser Operationen, die Java nicht sicher konvertieren zurück zu den kleineren, byte-und short-Datentypen. So zwingen Sie Sie zu werfen, um enge der Wert wieder nach unten zu byte/short.
Aber am Ende haben Sie Recht: Das Verhalten ist nicht konsistent zum Verhalten von int-Werten, zum Beispiel. Sie können ohne problem, fügen Sie zwei int-Werte und kein Fehler, wenn das Ergebnis überläuft.
Die Java-Sprache immer fördert Argumente von arithmetischen Operationen auf int, long, float oder double. So nehmen Sie den Ausdruck:
wobei a und b sind vom Typ byte. Dies ist die Kurzform für:
Dieser Ausdruck ist vom Typ int. Es macht natürlich Sinn zu geben, einen Fehler bei der Zuweisung eines int-Wert in eine byte-variable.
Warum sollte die Sprache sein, in dieser Weise definiert? Angenommen, a 60 und b war 70, dann a+b ist -126 - integer-überlauf. Als Teil einer komplizierteren Ausdruck, der erwartet wurde, um das Ergebnis in ein int, das kann schwer werden bug. Beschränken Sie die Verwendung von byte-und short-array-Speicher, Konstanten für Datei-Formate/Netzwerk-Protokolle und-Teilnehmer.
Es ist eine interessante Aufnahme von JavaPolis 2007. James Gosling gibt ein Beispiel darüber, wie kompliziert unsigned Arithmetik ist (und warum es nicht in Java). Josh Bloch weist darauf hin, dass sein Beispiel falsch Beispiel unter normalen unterzeichnet Arithmetik zu. Aus verständlichen rechnen, wir müssen beliebiger Genauigkeit.