우리는 static final
, 자바 컴파일러를 선언 범위를 벗어난 숫자를 감지 할만큼 똑똑 보인다왜 범위 내에서 long 값이 암시 적으로 변환되지 않았습니까? (? 또는 사전 컴파일러)
public class Test {
// setup variables:
public static final int i_max_byte = 127;
public static final int i_max_byte_add1 = 128;
public static final int i_max_short = 32767;
public static final int i_max_short_add1 = 32768;
public static final int i_max_char = 65535;
public static final int i_max_char_add1 = 65536;
public static final char c_max_byte = 127;
public static final char c_max_byte_add1 = 128;
public static final char c_max_short = 32767;
public static final char c_max_short_add1 = 32768;
public static final short s_min_char = 0;
public static final short s_min_char_sub1 = -1;
public static final short s_max_byte = 127;
public static final short s_max_byte_add1 = 128;
// all these are OK:
public static final byte b1 = i_max_byte;
public static final byte b2 = s_max_byte;
public static final byte b3 = c_max_byte;
public static final byte b4 = (short) i_max_byte;
public static final byte b5 = (char) i_max_byte;
public static final char c1 = i_max_char;
public static final char c2 = s_min_char;
public static final short s1 = i_max_short;
public static final short s2 = c_max_short;
// pre-compiler complains "type-mismatch":
public static final byte _b1 = i_max_byte_add1;
public static final byte _b2 = s_max_byte_add1;
public static final byte _b3 = c_max_byte_add1;
public static final byte _b4 = (short) i_max_byte_add1;
public static final byte _b5 = (char) i_max_byte_add1;
public static final char _c1 = i_max_char_add1;
public static final char _c2 = s_min_char_min_us1;
public static final short _s1 = i_max_short_add1;
public static final short _s2 = c_max_short_add1;
}
위의 코드는 증명이 int
, short
및 char
값 , 컴파일러는 값이 지정된 변수의 유형에 대해 범위를 벗어날 경우에만 불평합니다.
public class Test2 {
public static final long l_max_byte = 127;
public static final long l_max_byte_add1 = 128;
public static final long l_max_char = 32767;
public static final long l_max_char_add1 = 32768;
public static final long l_max_short = 65535;
public static final long l_max_short_add1 = 65536;
public static final long l_max_int = 2147483647;
public static final long l_max_int_add1 = 2147483648L;
// "type-mismatch" for all:
public static final byte b1 = l_max_byte;
public static final byte b2 = l_max_byte_add1;
public static final char c1 = l_max_char;
public static final char c2 = l_max_char_add1;
public static final short s1 = l_max_short;
public static final short s2 = l_max_short_add1;
public static final int i1 = l_max_int;
public static final int i2 = l_max_int_add1;
}
왜 char
값 컴파일러 int
, short
에 대한 범위 감지에서만 똑똑하고 : 숫자가 범위 내에있을 때
그러나 long
값, 컴파일러도 불만?
컴파일러가 long
값의 범위 감지를 수행하지 않는 이유는 무엇입니까?
이전 Java 디자인으로 인해 제한된 범위 (-128 - 127)에서만 컴파일됩니다. 와이드닝 그냥 작품을 찾으십시오. – Hannes
@Hannes, Yea 넓히는 것은 괜찮습니다 (잘 지내기 때문에, 항상 범위 내입니다). 이상하게 좁은 부분입니다. 어떤 식 으로든 범위 검색은 좁혀지는 값이'int','short' 또는'char' 타입 일 때만 활성화됩니다. – Pacerier