Java类型转换示例

时间:2016-12-20 11:14:01

标签: java casting

我很快就参加了考试,我希望有人检查我的解释,为什么编译器允许某些转换,而且有些转换不是。

字节 - >短 - > int - >长 - >浮动 - >双

所以我总是可以(从一个明确地)从小到大(例如从字节到长)。但要朝着这个方向前进< - 我必须明确地进行类型转换。到目前为止一切都那么好,但考试中的问题仍然有点棘手。

int value1 = (double) 10;

不允许。 Eclipse说不能从double转换为int。但是不是已经整数10了吗?我真的不明白。

byte value2 = (int) 120.0;

允许。所以120.0被削减到120,这是一个在一个字节范围内的整数。但是例如下面的

byte value3 = (int) 33500.0;

是不允许的。因为它不在一个字节的范围内?

double value4 = (int) 13.2;

允许。 13.2被切割为13,这是一个整数。你总是可以指定小到大。

int value = 10f;

不允许。因为你不能从float转换为int,但是

int value = (int) 10f

是允许的,因为它现在已经明确地投放了。

double someValue = (int) 12.3;

允许,我想。但这并没有多大意义,是吗?因为12.3已经是双倍了。

short v1 = (int) 42.0;

允许。但为什么??我以为你不能进入这个< - 方向。

2 个答案:

答案 0 :(得分:4)

JLS Sec 5.2

中对此进行了描述
  

分配上下文允许使用以下之一:

     
      
  • 身份转换(第5.1.1节)
  •   
  • 扩大原始转换(第5.1.2节)
  •   
     

...

     

此外,如果表达式是byte,short,char或int类型的常量表达式(第15.28节):

     
      
  • 如果变量的类型是byte,short或char,则可以使用缩小的基元转换,并且常量表达式的值可以在变量的类型中表示。
  •   

您的示例都可以用以下规则解释:

double value4 = (int) 13.2;

(int) 13.2的类型为int,因此会应用加宽的基元转换。

int value = (int) 10f;

(int) 10f的类型为int,因此会应用标识转换。

double someValue = (int) 12.3;

(int) 12.3的类型为int - 其值为12 - 因此会应用加宽的基元转换。 12.3是双精度的事实在这里是无关紧要的 - 你没有为变量分配12.3,你正在分配(int) 12.3 == 12

byte value2 = (int) 120.0;
short v1 = (int) 42.0;

这些是允许的,因为表达式是int类型的常量,它们的值可以分别用byteshort表示,因此适用缩小的原始转换情况。

int value1 = (double) 10;
int value = 10f;

这是不允许的,因为它需要从浮点类型到int的缩小转换。只能隐式缩小某些常量整数值(不是long)。

byte value3 = (int) 33500.0;

这是不允许的,尽管表达式为int,因为(int) 33500.0 == 33500超出了byte的范围。

答案 1 :(得分:2)

有两种类型的投射:

  1. 隐式类型转换(扩展转换)
  2. 显式类型转换(缩小转换)
  3. 您提到的字节序列 - >短 - > int - >长 - >浮动 - > double用于隐式类型转换。

    Example:
    short v1 = 4;
    int i = v1;
    System.out.print(i);
    
      

    输出:4

    我们在值之前使用(数据类型)将其更改为另一个的称为显式类型转换。这样我们可以将较大的数据类型值分配给较小的数据类型值。

        Example:
        short v1 = (int)42.0;
        System.out.print(v1);
    
      

    输出:42

    希望你得到所有答案。