тип леене на байт и int - java

Аз имам кодов фрагмент:

class AutoTypeCast{
public static void main(String...args){
int x=10;
byte b=20;//no compilation error
byte c=x;//compilation error
}
}

Защо 20 автоматично се пренасочва към byte докато x не?

Отговори:

5 за отговор № 1

защото x е int и има по-широк обхват като byte, Ето защо може да има загуба на данни е да го присвоите byte.

20 е константа и докато времето за компилация е гарантирано да бъде в обхвата на byte.


3 за отговор № 2

Защото компилаторът не може да разберестойност на X при компилиране. Така се приема, че X може да съдържа стойност, която е по-голяма от байтовия диапазон. Ако направите променлива X като окончателна, тогава тя няма да ви даде време за компилация.

        final int x=10;
byte b=20;//no compilation error
byte c=x;//no compilation error

1 за отговор № 3

20 винаги могат да бъдат представени с байт, докато x, което според компилатора може да бъде всяко цяло число, може да е твърде голямо, за да бъде представено с байт.


1 за отговор № 4

20 е в -128..127 обхват, така че стойността му се вписва byte.


1 за отговор № 5

В такъв случай x се инициализира до 10, така че няма да има загуба на данни при преобразуването от 32-битова int до 8-битов byte, Но като цяло, когато се превръща от int да се byte, може да има загуба на данни, така че правилата на езика Java забранява възлагането int стойностите до a byte без гласове. Това правило е създадено, за да направи по-трудно да се пише бъги код. Чрез вмъкване на (byte) гласове, вие реално казвате на компилатора: "Да, имам мисъл за възможността за загуба на данни, и това не е проблем тук (или, че" всъщност това, което искам). "


1 за отговор № 6

Когато компилаторът гледа линията

byte b=20;

знае, че търси байт след това б =, Когато намери константна числова стойност, тя знае, че по време на компилиране определено ще бъде в обхвата на байт така той автоматично ще го хвърли.

Кога се вижда линията

byte c=x;

отново търси байт след това С = но вместо да намери числова константа, намира променлива, която вече има определен тип и, по време на компилацията, не може да бъде сигурна, че ще бъде в обхвата на байт така че получавате грешка.


0 за отговор № 7

X се дефинира като цяло число, докато стесняване може да има загуба на данни, затова грешката при компилатора. Се отнасят Спецификация jvm за реализации и промоции


0 за отговор № 8

Леенето нагоре е автоматично, когато се претопява или свива (byte c=x;) трябва да бъде изрично, тъй като може да причини загуба на точност, която програмистът трябва да е наясно с нея. За да го коригирате, трябва да сложите изрично подаване byte c=(byte)x;