Java:perché viene visualizzato il messaggio di errore “Tipo non corrispondente:non è possibile convertire un int byte”

StackOverflow https://stackoverflow.com/questions/81392

Domanda

Se è possibile dichiarare variabili di tipo byte o di breve e di tentare di eseguire operazioni aritmetiche su questi, è visualizzato il messaggio di errore "Tipo non corrispondente:non è possibile convertire int a breve" (o di conseguenza "Tipo non corrispondente:non è possibile convertire un int byte").

byte a = 23;
byte b = 34;
byte c = a + b;

In questo esempio, l'errore di compilazione è nella terza riga.

È stato utile?

Soluzione

Anche se gli operatori aritmetici sono definiti di operare su qualsiasi tipo numerico, secondo la specifica del linguaggio Java (5.6.2 Numerici Binari Promozione), operandi di tipo byte e breve sono automaticamente promosso a int prima di essere consegnato agli operatori.

Per eseguire operazioni aritmetiche su variabili di tipo byte o breve, è necessario racchiudere l'espressione in parentesi (all'interno del quale le operazioni saranno effettuate come di tipo int), cast e poi il risultato per il tipo desiderato.

byte a = 23;
byte b = 34;
byte c = (byte) (a + b);

Ecco un follow-sulla questione del reale Java guru:perché?I tipi di byte e di breve sono perfettamente tipi numerici.Perché Java non consentire la diretta operazioni aritmetiche su questi tipi di?(La risposta non è "perdita di precisione", come non c'è alcun motivo apparente per la conversione da int, in primo luogo.)

Aggiornamento:jrudolph suggerisce che questo comportamento si basa su operazioni disponibili nella JVM, in particolare, che solo la piena e doppia parola operatori sono implementati.Quindi, per operatore su byte e pantaloncini, che deve essere convertito in int.

Altri suggerimenti

La risposta alla tua domanda è qui:

operandi di tipo byte e breve sono automaticamente promosso a int prima di essere consegnato agli operatori

Quindi, nel tuo esempio, a e b sono entrambi convertiti in int prima di essere consegnata all'operatore+.Il risultato dell'aggiunta di due ints insieme è anche un int.Cercando di assegnare a tale int per un byte valore di causa l'errore perché c'è una potenziale perdita di precisione.Esplicitamente casting il risultato si indica al compilatore "so cosa sto facendo".

Penso che la questione è, che la JVM supporta solo due tipi di valori di stack:parola di dimensioni e doppia parola di dimensioni.

Allora probabilmente deciso che avrebbero bisogno solo di una operazione che lavora sulla parola di dimensioni interi stack.Quindi c'è solo iadd, imul e così via a livello di bytecode (e non operatori per byte e pantaloncini).

Così si ottiene un valore di tipo int, come il risultato di queste operazioni che Java non può tranquillamente convertire i byte inferiore e pochi tipi di dati.In modo che la forza di lanciare per restringere il valore in basso a byte/breve.

Ma alla fine hai ragione:Questo comportamento non è coerente con il comportamento di int, per esempio.Si può senza problema aggiungere due int e non ottenere alcun errore se il risultato overflow.

Il linguaggio Java, promuove sempre argomenti di aritmetica, gli operatori di int, long, float o double.In modo da prendere l'espressione:

a + b

dove a e b sono di tipo byte.Questo è l'abbreviazione per:

(int)a + (int)b

Questa espressione è di tipo int.Si rende chiaro il senso di dare un errore in caso di assegnazione di un valore di tipo int il valore di una variabile di tipo byte.

Perché la lingua essere definito in questo modo?Supponiamo che un era di 60 e b era di 70, quindi a+b è -126 - integer overflow.Come parte di un più complicato espressione che era previsto come risultato un int, questo può diventare difficile bug.Limitare l'uso di byte e breve di un array di storage, costanti per i formati di file/protocolli di rete e puzzle.

C'è un interessante registrazione da JavaPolis 2007.James Gosling sta dando un esempio su quanto sia complicata l'aritmetica con segno è (e perché non è in Java).Josh Bloch sottolinea che il suo esempio di sbagliato esempio in condizioni di normale firmato aritmetica troppo.Per comprensibili aritmetica, abbiamo bisogno di precisione arbitraria.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top