Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的类型转换歧义_Java_Casting - Fatal编程技术网

Java中的类型转换歧义

Java中的类型转换歧义,java,casting,Java,Casting,我对Java还很陌生。遇到了一个问题,希望对此有更多的了解 以下代码未编译: byte a = 10; byte b = 20; byte c = a + b; 编译错误->类型不匹配:无法从int转换为byte 这是一个编译错误,因为: 在Java中,所有整数文本都被视为整数 因此,a+b会产生一个整数文本,在存储到字节类型变量之前需要将其类型转换为字节,因为可能会丢失精度。我完全理解上述概念 让我困惑的是一个与浮点变量类似的概念。以下代码段已成功编译: float d = 1.2; flo

我对Java还很陌生。遇到了一个问题,希望对此有更多的了解

以下代码未编译:

byte a = 10;
byte b = 20;
byte c = a + b;
编译错误->类型不匹配:无法从int转换为byte

这是一个编译错误,因为:

在Java中,所有整数文本都被视为整数

因此,a+b会产生一个整数文本,在存储到字节类型变量之前需要将其类型转换为字节,因为可能会丢失精度。我完全理解上述概念

让我困惑的是一个与浮点变量类似的概念。以下代码段已成功编译:

float d = 1.2;
float e = 2.3;
float f = d + e;
根据Java:

在Java中,所有十进制文字都被视为十进制文字


因此,类似地,(d+e)必须产生一个十进制文本,它将被视为十进制类型,并存储在浮点类型变量中。这里我们也有精度损失。为什么编译器不强迫我们在这里进行显式类型转换呢?为什么这里不是编译错误

在java中,不能将浮点值声明为:

float d = 1.2;
float e = 2.3;
因为编译器推断
1.2
2.3
为双精度。您必须将其转换为浮动:

float d = (float) 1.2;
float e = (float) 2.3;

Java中的类型转换歧义

您发布的代码中没有类型转换

以下代码未编译:

byte a = 10;
byte b = 20;
byte c = a + b;
这是一个编译错误,因为:

在Java中,所有整数文本都被视为整数

不,不是。这是一个编译错误,因为小于
int
的类型之间的所有操作都会生成
int
值:

如果除移位运算符以外的整数运算符至少有一个long类型的操作数,则使用64位精度执行该操作,并且数字运算符的结果为long类型。如果另一个操作数不长,则首先通过数字提升(§5.6)将其加宽(§5.1.5)以键入long

否则,该操作将使用32位精度执行,数值运算符的结果为int类型。如果任一操作数不是int,则首先通过数值提升将其加宽为int类型

如果您声称的Java规则实际上是Java规则,那么这三行代码都无法编译。但是Java中没有您所声称的规则。你刚刚编出来的

因此,a+b产生一个整数文本

不,没有。结果是一个整数值

在存储到字节类型变量之前,需要将其类型转换为字节,因为可能会丢失精度。我完全理解上述概念

不,你根本不明白

让我困惑的是一个与浮点变量类似的概念。以下代码段已成功编译:

float d = 1.2;
float e = 2.3;
float f = d + e;
不,没有。这两行都会产生编译错误:
错误:不兼容的类型:可能从double到float的有损转换

float f = d + e;
这是一份汇编

根据Java:

在Java中,所有十进制文字都被视为十进制文字

没有这样的规则。再说一次,这是你编的。Java中没有“十进制文字”或
decimal

因此,在类似的注释中(d+e)必须产生十进制文字

否。它会产生一个
浮点值

它将被视为十进制类型

Java中没有“十进制类型”。有一个
BigDecimal
,它是一个类,不是一个类型,但它与这个问题没有任何关系

并存储在一个浮点型变量中。这里我们也有精度损失

不,我们没有:

如果数值运算符的操作数中至少有一个为double类型,则使用64位浮点运算执行该运算,数值运算符的结果为double类型的值。如果另一个操作数不是double,则首先通过数字提升(§5.1.5)将其加宽为double

否则,使用32位浮点算法执行该运算,数值运算符的结果为float类型的值。(如果另一个操作数不是浮点,则首先通过数字提升将其加宽为类型浮点。)

你写道:

为什么编译器不强迫我们在这里进行显式类型转换呢?为什么这里不是编译错误

因为这不是一个错误。它不是前一个错误的实例,因为它不涉及比
int
更窄的类型


不要只是制定规则,然后问为什么Java不遵守规则。检查实际规则。

这与文字无关;它是关于
+
操作符的
byte+byte
给出了
int
,但是
float+float
给出了
float
。看看这个。可能重复。您在引号中引用的“根据Java”规则的可能重复项不存在。你刚刚编的。不要对未引用的文本使用引用格式。
float f = d + e;