Java中的类型转换错误

cgvd09ve  于 2023-06-28  发布在  Java
关注(0)|答案(3)|浏览(103)
char c1 = (int) Math.random();
        
char c2 = (int) 99.0;
        
char c3 = (int) getDouble();

为什么第一行和第三行给予错误,而第二行没有?
getDouble()的实现:
public static double getDouble() { return 9.0; }

wwtsj6pe

wwtsj6pe1#

在这三种情况下,您都将int类型的表达式赋给char类型的变量。这需要一个收缩原语转换(因为int大于char)。
让我们看看在赋值上下文中是否允许这样做。
此外,如果表达式是byteshortcharint类型的常量表达式(§15.29):

  • 如果变量的类型是byteshortchar,并且常量表达式的值可以在变量的类型中表示,则可以使用收缩原语转换。

只有当表达式是一个 * 常量表达式 * 时才允许。
从“常量表达式”的定义中摘录:
常量表达式是表示原始类型或String的值的表达式,它不会突然完成,并且仅使用以下内容组成:

  • 基元类型的文本、字符串文本和文本块
  • 转换为基元类型和转换为String类型
  • [...]

非正式地,常数表达式是其值可以在编译时计算的表达式。
在3个表达式(int)Math.random()(int)99.0(int)getDouble()中,只有(int)99.0是常量表达式。在不运行代码的情况下,很明显(int)99.0总是计算为值99。另外两个表达式不是常量表达式**,因为它们包含方法调用**,上面的列表中没有包含这些方法调用。
(int)99.0的值恰好在char(0-65535)的范围内。因此,允许从int转换为char

iaqfqrcu

iaqfqrcu2#

1.第一行代码给出错误的原因是Java中不允许将double转换为char。random()方法返回一个double

char c1 = (int) Math.random();`
  1. Java允许缩小原始转换,包括从doublechar的转换,在这种情况下,double值99.0显式转换为int值,然后该int值隐式缩小为char类型。
char c2 = (int) 99.0;

1.不确定getDouble()方法是什么

elcex8rz

elcex8rz3#

这是因为 * 99.0 * 是一个 * literal *。

return true;*
* char capitalC ='C';*
* 字节b = 100;*
* short s = 10000;*
int i = 0;...*

  • ...如果浮点字面值以字母F或f结尾,则该浮点字面值为float类型;否则,它的类型是double,并且可以选择以字母D或d结尾。

这类似于编译器在试图分配一个对于声明的类型来说太大的值时抛出错误的方式。

int value = 9876543210;

而且,当您分配已解析值时,则不会。

public static double getDouble() { return 9876543210d; }
int value = (int) getDouble();

或者是演员决议,

int value = (int) 9876543210d;

由于它是一个 * literal *,编译器认为它应该提供一个警告,以消 debugging 误。

System.out.println(value);

输出量

2147483647

编译器可以计算 * literal *,而不必进行任何解析,或额外理解封闭代码;它是“文字”值。

相关问题