char c1 = (int) Math.random(); char c2 = (int) 99.0; char c3 = (int) getDouble();
为什么第一行和第三行给予错误,而第二行没有?getDouble()的实现:public static double getDouble() { return 9.0; }
public static double getDouble() { return 9.0; }
wwtsj6pe1#
在这三种情况下,您都将int类型的表达式赋给char类型的变量。这需要一个收缩原语转换(因为int大于char)。让我们看看在赋值上下文中是否允许这样做。此外,如果表达式是byte、short、char或int类型的常量表达式(§15.29):
int
char
byte
short
只有当表达式是一个 * 常量表达式 * 时才允许。从“常量表达式”的定义中摘录:常量表达式是表示原始类型或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。
(int)Math.random()
(int)99.0
(int)getDouble()
iaqfqrcu2#
1.第一行代码给出错误的原因是Java中不允许将double转换为char。random()方法返回一个double
char c1 = (int) Math.random();`
char c2 = (int) 99.0;
1.不确定getDouble()方法是什么
elcex8rz3#
这是因为 * 99.0 * 是一个 * literal *。
return true;** char capitalC ='C';** 字节b = 100;** short s = 10000;*int i = 0;...*
这类似于编译器在试图分配一个对于声明的类型来说太大的值时抛出错误的方式。
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 *,而不必进行任何解析,或额外理解封闭代码;它是“文字”值。
3条答案
按热度按时间wwtsj6pe1#
在这三种情况下,您都将
int
类型的表达式赋给char
类型的变量。这需要一个收缩原语转换(因为int
大于char
)。让我们看看在赋值上下文中是否允许这样做。
此外,如果表达式是
byte
、short
、char
或int
类型的常量表达式(§15.29):byte
、short
或char
,并且常量表达式的值可以在变量的类型中表示,则可以使用收缩原语转换。只有当表达式是一个 * 常量表达式 * 时才允许。
从“常量表达式”的定义中摘录:
常量表达式是表示原始类型或
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
。iaqfqrcu2#
1.第一行代码给出错误的原因是Java中不允许将double转换为char。random()方法返回一个double
1.不确定getDouble()方法是什么
elcex8rz3#
这是因为 * 99.0 * 是一个 * literal *。
return true;*
* char capitalC ='C';*
* 字节b = 100;*
* short s = 10000;*
int i = 0;...*
这类似于编译器在试图分配一个对于声明的类型来说太大的值时抛出错误的方式。
而且,当您分配已解析值时,则不会。
或者是演员决议,
由于它是一个 * literal *,编译器认为它应该提供一个警告,以消 debugging 误。
输出量
编译器可以计算 * literal *,而不必进行任何解析,或额外理解封闭代码;它是“文字”值。