为什么在Java中允许使用double转换为char?

时间:2014-10-08 03:51:06

标签: java casting char double

为什么Java中允许char c = (char)65.8;

由于65.8不是精确的Unicode值,不应该抛出错误吗?据我所知,double被截断为整数,在本例中为65,但对我来说,允许程序员进行这样的转换似乎是不好的设计。

4 个答案:

答案 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 。由于我们缩小了范围,因此数据可能会丢失,因此这种转换被视为"不安全"

narrowing type conversion

字节转换为 char 是一种特殊情况,同时代表加宽缩小 。转换首先将字节转换为 int ,然后 int 转换为 char

我可以想到为什么缩小类型转换不会导致错误/异常的一个原因是在没有数据丢失的情况下允许方便/简单/快速的类型转换。编译器将它留给我们以确保转换后的数据能够适应较小的范围。如果我们想要快速截断值,例如舍入double的值(通过将其类型转换为int),它也很有用。

答案 1 :(得分:4)

它不会在赋值时自动发生:这将是一个编译错误。

程序员进行有意识的选择(例如类型转换)这一事实意味着她正在考虑可能的截断的可能性和责任。

答案 2 :(得分:2)

您可能拥有密码算法等代码,可能会将doublefloat投射到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并显示为字符。怎么了?