Byte byte1=new Byte((byte) 20);
Short short1=new Short((short) 20);
为什么我必须在Byte和Short中使用强制转换运算符,但我没有在其他DataType中使用强制转换运算符
Integer integer=new Integer(20);
Long long1=new Long(20);
Double double1=new Double(20);
Float float1=new Float(20);
答案 0 :(得分:9)
这是因为第二个代码段导致根据JLS §5.1.2扩大原始转化次数:
对原始类型的19个特定转换称为扩展原语转换:
byte
至short
,int
,long
,float
或double
short
至int
,long
,float
或double
char
至int
,long
,float
或double
int
至long
,float
或double
long
至float
或double
float
至double
而第一个没有;请注意,没有从int
转换为short
或byte
。
答案 1 :(得分:2)
文字“20”由编译器处理为 int 。 整数,长, Float 和 Double 可以处理大于或等于 int 所以编译器可以进行implizit强制转换。 短和字节确实具有较小的范围,可防止implizit强制转换。如果 Byte 或 Short 无法表示该数字,则可能会导致 ClassCastException 。
答案 2 :(得分:1)
答案 3 :(得分:0)
byte的构造函数定义为
public Byte(byte value) {
this.value = value;
}
它需要byte,因为你传递的是你需要显式转换的整数,同样适用于短
答案 4 :(得分:0)
Byte byte1=new Byte((byte) 20);
字节数据类型是8位带符号的二进制补码整数。它有 最小值为-128,最大值为127(含)。
但是,上面的20是一个整数。
int数据类型是32位带符号的二进制补码整数。它有 最小值-2,147,483,648,最大值2,147,483,647 (含)。
因此, byte 不能取出范围之外的任何值。当您尝试分配一个整数说 130 而不是 20 时,您将丢失数据(位),因为 130 超出字节范围。通过强制转换,您告诉编译器您已了解转换。