// automatic casting works for int to byte conversion as integer literal 127
// is in the range for byte
byte b1 = 127; //OK
// automatic casting doesn't work for long to int conversion
// even if long literal is in the range of int.
int i5 = 100L; // NOT OK - compilation error
加宽转换(例如byte
到int
)通常被Java编译器隐式地接受,因为不会丢失信息(int
的范围大于byte
)。
缩小转换范围(例如long
转换为int
,如您的情况)会导致信息丢失,因此通常需要显式转换。
看到这个类似的问题,还有这个。Java语言规范的一个相关部分:
如果变量的类型为:
>
字节,并且常量表达式的值可以在类型字节中表示
Short,并且常量表达式的值可以在Short类型中表示。
byte b1=127
执行隐式转换(参见上面引号中的粗体文本),“常量表达式的值在类型字节中是可表示的”。也就是说,127
可由字节
表示,因此转换是隐式的。如果您尝试byte b1=128
,您将得到一个关于不兼容类型的错误,因为byte
不能表示128
。这里允许隐式强制转换的唯一原因是我们使用的是常量表达式。
我们在inti5=100L
中没有得到隐式转换(即使100在int
的范围内),因为它没有在允许的隐式转换中列出(变量的类型int
不是byte
、short
或char
之一)。
我们也不会在字节a=0L
中得到隐式转换,这一次是因为常量表达式的类型为long
,而不是byte
、short
、char
或int
。
一个普通的程序员如何知道隐式允许哪一种缩小转换?
隐式缩窄转换仅在为变量赋值常量表达式时发生。在这些情况下,隐式转换是很好的,因为我们不希望一直编写类似byte b=(byte)0
的代码。同时,如果我们编写类似byte b=128
的代码,我们确实希望得到警告,因为它没有直观的行为。
当我们不赋值常量表达式(例如int x=0;byte b=x;
)时,我们总是希望在进行潜在的有损转换时得到警告,因为它们是危险的-因此在这种情况下显式转换也是有意义的。
问题内容: 我可以隐式地将int转换为long,并将long转换为Long。为什么无法将int隐式转换为Long?为什么Java不能在示例的最后一行进行隐式转换? 问题答案: 和是对象。装箱/拆箱仅适用于原语。做的就像,那不是不!另外,请记住,之间没有继承,所以甚至无效
在java中,隐式转换的层次结构是long可以容纳8字节的数据。那么为什么它被隐式地类型化为float,它只能容纳4个字节,而不是double,它可以容纳8个字节。为什么它不被认为是缩小呢? 哪些基元类型将隐式转换为char?
所以,问题是--为什么在I=L的情况下,当L的大小足够小到适合I时,必须显式地进行,但在F=L的情况下,当L的大小也适合F时,铸造可以隐式地进行,而不会产生错误。 我的意思是,在这两种情况下,右操作数的大小可能不适合左操作数。那么,为什么在一种情况下(I=L),强制转换必须显式进行,而在另一种情况下(F=L)可以隐式进行呢?虽然隐式地将长var转换为int var比隐式地将长var转换为浮点var
问题内容: 我想知道为什么Java不允许将布尔值转换为整数,如下所示: 例如,这可以用一行代码来完成, 但似乎更好和更容易阅读的方法是允许类型转换,如和一样。Java为什么不包括此功能? 问题答案: 不允许这样做是因为Java设计人员(正确地)认识到C和C ++中的布尔/整数重载是错误的重要来源。 (我记得曾经写过一些设计原理的书,但我找不到。) 例如: 是合法的,但可能是用C或C ++编写的应用
问题内容: 您可以将int隐式转换为double: 您可以将int显式转换为double: 您可以将double显式转换为int: 为什么不能将一个double隐式转换为int? : 问题答案: 的范围比宽。这就是为什么您需要显式强制转换。由于相同的原因,您不能隐式地从转换为: