char
w Javie jest 16 bit unsigned wartość, natomiast byte
jest 8 bitowa wartość. Dozwolony zakres dla bajtu to [-128, 127]
. Tak więc, nie wszystkie postaci mogą być przypisane w byte
.
W pierwszej metodzie, jesteś Zwracanie char
z punkt kodowy = 1 ('b' - 'a'
). Teraz, odkąd zdefiniowałeś char
jako final
, i przypisując do niego wyrażenie stałe, staje się stałą czasową kompilacji. Tak więc kompilator nie daje żadnego błędu kompilatora.
Od JLS Section 5.2:
If the expression is a constant expression (§15.28) of type byte, short, char, or int:
- A narrowing primitive conversion may be used if the type of the variable is byte, short, or char, and the value of the constant expression is representable in the type of the variable.
Podkreślenie moje.
Jeśli jednak zrobić c
nieostatecznej, będzie to również spowodować błąd kompilatora:
static byte m1() { // This will be an error
char c = 'b'-'a';
return c;
}
Powodem jest to, c
nie jest czas kompilacji stały dłużej, a kompilator nie robi niejawny downcast.
W drugiej metodzie zwracasz char
, którą zdałeś. Parametr c
nie ma stałej czasowej kompilacji. Podczas kompilacji nie wiadomo, jaką wartość może uzyskać metoda. Podobnie, jeśli zdasz char
z punktami kodowymi spoza zakresu dozwolonej wartości byte
, to nie będzie działać.
Aby 2nd pracę metodzie można robić wyraźne Obsada:
static byte m3(final char c) {
return (byte)c; // 3
}
Co masz na myśli, mówiąc, że nie działa? –
podczas kompilacji mówi: error: możliwa utrata precyzji – chathura
Być może statyczna optymalizacja w metodzie 1? –