加倍到int和加倍int

时间:2019-11-07 07:13:05

标签: java casting int double

我想知道当我的示例中Double转换为int时会发生什么情况?

这种情况是正确的

Double d = 123.13;
int i = (int)(Math.random()*d);

这种情况是错误的

Double d = 123.13;
int i = (int)(d);

enter image description here 错误消息:Inconvertible types;cannot cast'java.lang.Double'to'int'

我知道我可以使用 d.intValue 来做到这一点,但是我只想知道上面两种情况的区别

4 个答案:

答案 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是班级,doubleprimitive 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;