Java 编译错误:强制转换

Java 编译错误:强制转换,java,Java,有人能解释一下为什么下面的代码无法编译吗。错误是:“可能会丢失精度。”: 谢谢。使用“int”算法添加字节;因此,结果是一个int,必须从int返回到byte,这会导致截断的可能性。因为这两个字节变量是+的操作数,它们被隐式提升为int。这称为数值提升。因为int大于byte,而a+b的结果产生int,转换为byte可能会删除一些位,因为int大于byte。因此,“精度损失” 用于隐式数字升级的文档: 类型大小的文档: 请注意,强制转换的优先级高于+运算符。您的代码执行以下操作: byte a

有人能解释一下为什么下面的代码无法编译吗。错误是:“
可能会丢失精度。
”:


谢谢。

使用“int”算法添加字节;因此,结果是一个int,必须从int返回到byte,这会导致截断的可能性。

因为这两个字节变量是+的操作数,它们被隐式提升为int。这称为数值提升。因为int大于byte,而a+b的结果产生int,转换为byte可能会删除一些位,因为int大于byte。因此,“精度损失”

用于隐式数字升级的文档:

类型大小的文档:


请注意,强制转换的优先级高于+运算符。您的代码执行以下操作:

byte a = 50;
byte b = 40;
byte sum = ((byte)a) + b;
System.out.println(sum);
强制转换是多余的,因为
a
已经是
字节。你可能是这个意思:

byte a = 50;
byte b = 40;
byte sum = (byte) (a + b);
System.out.println(sum);

您正确地标识了强制转换是必需的,但不幸的是,由于运算符的优先级,您没有将其应用于正确的表达式

考虑以下代码段:

static void f(char ch) {
    System.out.println("f(char)");
}
static void f(int i) {
    System.out.println("f(int)");
}
public static void main(String[] args) {
    char ch = 'X';
    f( (char)  ch + 1  ); // prints "f(int)"
    f( (char) (ch + 1) ); // prints "f(char)"
}
强制转换比加法具有更高的优先级,这就是代码段打印其所做内容的原因。也就是说,第一个调用相当于
f(((char)ch)+1)。添加的结果是
int
,这就是调用
f(int)
重载的原因


这里的教训是,除非进行非常简单的转换,否则应该始终使用括号。一般来说,即使没有必要,也要考虑使用括号来明确的评估顺序。它们会产生更好、更可读的代码。

在我看来,这有点愚蠢。编程语言不应该考虑这种错误。但我现在明白了。谢谢。我对java编译器了解不多,但在大多数C编译器中,这只是一个警告。认为自己是幸运的;1:这是关键部分;演员阵容没有被应用到提问者可能认为是什么。
static void f(char ch) {
    System.out.println("f(char)");
}
static void f(int i) {
    System.out.println("f(int)");
}
public static void main(String[] args) {
    char ch = 'X';
    f( (char)  ch + 1  ); // prints "f(int)"
    f( (char) (ch + 1) ); // prints "f(char)"
}