Аз имам кодов фрагмент:
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;