我想知道当我的示例中Double
转换为int时会发生什么情况?
这种情况是正确的
Double d = 123.13;
int i = (int)(Math.random()*d);
这种情况是错误的
Double d = 123.13;
int i = (int)(d);
错误消息:Inconvertible types;cannot cast'java.lang.Double'to'int'
我知道我可以使用 d.intValue
来做到这一点,但是我只想知道上面两种情况的区别
答案 0 :(得分:3)
包装器类型只能转换为其包装的原始类型。
即您可以将Double
投射到double
,但不能直接投射到int
。
第二个片段可以通过以下方式传递编译:
Double d = 123.13;
int i = (int)(double)(d);
在第一个代码段中,您正在将原语(Math.random()*d
的类型为double
)强制转换为int
。
答案 1 :(得分:0)
您也可以像这样强制转换原始值:
Double d = 123.13;
int i = (int) d.doubleValue();
...与Eran给出的答案几乎相同。
答案 2 :(得分:0)
情况1:Double d = 123.13;int i = (int)(Math.random()*d);
情况2:Double d = 123.13;int i = (int)(d);
上述两种情况有什么区别?
在第一种情况下,Math.random()
返回一个double
,而不是Double
,因此这是正确的,因为可以将double
强制转换为int(丢失小数部分)。
情况2是错误的,并且在@Eran的答案中解释了原因,包装器类型只能转换为它包装的原始类型。即无法将Double
转换为不可转换原始int
答案 3 :(得分:0)
发生了很多事情,请参见JLS 5.1.7. Boxing Conversion。
第二个错误,因为Double是班级,double
是primitive data type
仅使用原始数据类型可以缩小
JLS 5.1.3. Narrowing Primitive Conversion
针对原始类型的22种特定转换称为缩小原始转换:
字节或字符短
字符到字节或短字符
int到字节,short或char
长到字节,短,字符或整数
浮点到字节,short,char,int或long
双精度字节,短型,字符型,整型,长型或浮点型
要使代码正常工作,您可以像下面那样更改代码
double d = 123.13;
int i = (int)d;