Vra

As jy veranderlikes van tipe byte of kort en poging tot rekenkundige operasies uit te voer op hierdie verklaar, ontvang jy die fout "Tipe mismatch: kan int nie skakel na kort" (of dienooreenkomstig "Tipe mismatch: kan int nie skakel na byte").

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

In hierdie voorbeeld, die saamstel fout is op die derde lyn.

Was dit nuttig?

Oplossing

Hoewel die rekenkundige operateurs word gedefinieer om te werk op enige numeriese tipe, volgens die Java taalspesifikasie (5.6.2 Binêre Numeriese Bevordering), operande van tipe byte en kort is outomaties bevorder tot int voor oorhandig aan die operateurs.

Om rekenkundige operasies op veranderlikes van tipe byte of kort uit te voer, moet jy die uitdrukking in hakies omsluit (binnekant van wat bedrywighede uit as tipe int sal word), en dan gooi die gevolg terug na die gewenste tipe.

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

Hier is 'n follow-op vraag na die ware Java ghoeroes: hoekom? Die tipes byte en kort is heeltemal fyn numeriese tipes. Waarom Java nie direkte rekenkundige operasies op hierdie tipe toelaat? (Die antwoord is nie "verlies van presisie", want daar is geen oënskynlike rede om te skakel na int in die eerste plek.)

Update: jrudolph dui daarop dat hierdie gedrag is gebaseer op die bedrywighede beskikbaar in die JVM, spesifiek, dat slegs voltydse en dubbel-woord operateurs geïmplementeer word. Dus, om operateur op grepe en kortbroek, hulle moet verwerk word na int.

Ander wenke

Die antwoord op jou opvolg vraag is hier:

  

operande van tipe byte en kort is outomaties bevorder tot int voordat dit oorhandig aan die operateurs

So, in jou voorbeeld, a en b is beide omgeskakel word na 'n int voor oorhandig aan die + operateur. Die gevolg van bymekaar te tel twee ints is ook 'n int. Probeer om dit int 'n byte waarde toe te ken veroorsaak dat die fout, want daar is 'n potensiële verlies van presisie. Deur uitdruklik beslissende die resultaat wat jy vertel die samesteller "Ek weet wat ek doen".

Ek dink, die saak is, dat die JVM ondersteun net twee tipes stapel waardes: woord grootte en dubbel woord grootte.

Toe waarskynlik het hulle besluit dat hulle net een operasie wat werk op woord grootte heelgetalle op die stapel sou nodig. Daar is dus net iadd, imul en so aan by bytecode vlak (en geen operateurs vir grepe en kortbroek).

So jy 'n int waarde as gevolg van hierdie bedrywighede wat Java kan nie veilig terug te skakel na die kleiner byte en kort datatipes. Sodat hulle dwing om te gooi om die waarde terug na byte vernou / kort.

Maar op die ou end is jy reg: Hierdie gedrag is nie in ooreenstemming met die gedrag van SY, byvoorbeeld. Jy kan sonder probleem voeg twee SY en kry geen fout as die gevolg oorloop.

Die Java taal altyd bevorder argumente van rekenkundige operateurs int, lang, vlot of dubbel. So neem die uitdrukking:

a + b

waar a en b is van tipe byte. Dit is snelskrif vir:

(int)a + (int)b

Hierdie uitdrukking is van tipe int. Dit maak duidelik sin om 'n fout te gee wanneer die toeken van 'n int waarde aan 'n byte veranderlike.

Waarom sou die taal gedefinieer word op hierdie manier? Veronderstel 'n was 60 en b was 70, dan A + B is -126 - heelgetal oorloop. As deel van 'n meer ingewikkelde uitdrukking wat na verwagting lei tot 'n int, kan dit 'n moeilike fout geword. Beperk die gebruik van byte en kort na verskeidenheid stoor, konstantes vir lêerformate / netwerkprotokolle en puzzelaars.

Daar is 'n interessante opname van Java Polis 2007 James Gosling is ʼn voorbeeld te gee oor hoe ingewikkeld unsigned rekenkundige is (en waarom dit nie in Java). Josh Bloch wys daarop dat sy voorbeeld gee die verkeerde voorbeeld onder normale onderteken rekenkundige ook. Vir verstaanbaar rekenkundige, moet ons arbitrêre presisie.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top