为什么Java中允许char c = (char)65.8;
?
由于65.8
不是精确的Unicode值,不应该抛出错误吗?据我所知,double被截断为整数,在本例中为65
,但对我来说,允许程序员进行这样的转换似乎是不好的设计。
答案 0 :(得分:10)
这称为缩小类型转换。
来自oracle docs
:
原始类型的22个特定转换称为缩小 原始转换:
short to byte或char
char to byte或short
int to byte,short或char
long to byte,short,char或int
float to byte,short,char,int或long
double to byte,short,char,int,long或float
缩小的原始转换可能会丢失有关的信息 数值的整体幅度,也可能失去精度 范围。
在Java中,有两种基本类型的类型转换:加宽和缩小。
当您从较小(或较窄)的类型转换为具有较大(或较宽)范围的类型时,会发生 widening conversion
。因此,没有机会丢失数据,转换被视为"安全。"
当您从具有较大(或较宽)的类型转换为具有较小(或较窄)范围的类型时,会发生 narrowing conversion
。由于我们缩小了范围,因此数据可能会丢失,因此这种转换被视为"不安全"
从字节转换为 char 是一种特殊情况,同时代表加宽和缩小 。转换首先将字节转换为 int ,然后 int 转换为 char 。
我可以想到为什么缩小类型转换不会导致错误/异常的一个原因是在没有数据丢失的情况下允许方便/简单/快速的类型转换。编译器将它留给我们以确保转换后的数据能够适应较小的范围。如果我们想要快速截断值,例如舍入double
的值(通过将其类型转换为int
),它也很有用。
答案 1 :(得分:4)
它不会在赋值时自动发生:这将是一个编译错误。
程序员进行有意识的选择(例如类型转换)这一事实意味着她正在考虑可能的截断的可能性和责任。
答案 2 :(得分:2)
您可能拥有密码算法等代码,可能会将double
或float
投射到char
。此外,char
是无符号类型,这意味着(char)200.5
会产生与(char)(byte)200.5
不同的内容。
答案 3 :(得分:1)
愚蠢的计算机怎么知道意图是什么?
char c = (char)65.8; // valid, double gets converted and explicitly truncated to a char
可能会发生这种情况,在计算过程中,您可能正在进行一些涉及双重算术的复杂计算,最后在最终值上,您应用trucation并显示为字符。怎么了?