2
public class Ambiguity {
    public static void main(String[] args) {
        int Integer = 3;
        System.out.println((Integer) null);       // cast; prints "null"
        System.out.println((Integer) - Integer);  // subtraction; prints "0"
        System.out.println((Integer) (-Integer)); // cast; prints "-3"
    }
}

在 Java 中,我可以声明一个名为 Integer 的变量,然后编写可以转换为 Integer 类或涉及 Integer 变量的表达式的代码。Java如何解决类名和变量名之间的歧义?规范中是否有正式规则?这是一个特别的启发式的东西吗?我知道 C 编译器必须处理类似的问题,并且我知道他们如何处理它,但 Java 似乎更宽容。

4

3 回答 3

1

评估顺序请参考JLS

“Java 编程语言保证运算符的操作数似乎以特定的评估顺序进行评估,即从左到右。”

(Integer) -Integer

现在,当它被解析时,很明显有一个减法运算符,其中(Integer)Integer作为操作数。从左边开始,括号表达式应该被评估为一个值(作为它后面的 and 运算符),因此它不会假设它是 Type 而是变量。

(Integer) (-Integer)

解析时,有两个标记(每个都在括号内)没有任何运算符,因此没有歧义(表达式是值还是类型)​​。第一个括号将始终是类型和表达式,其后将始终被评估为要转换的值。

于 2013-05-07T07:13:09.463 回答
0

据我所知,解析器是从右到左的。第一个说法很明显。

在第二个语句中,解析器首先找到一个变量,然后在该符号之后找到一个表达式“-”,他期望另一个变量,但他找到了一个右括号,这意味着他首先需要解析括号内的表达式。在您的示例中,只有变量。因此解析器获取该值并将其与另一个变量相减。

在第三条语句中,解析器首先找到一个右括号 => 他将解析括号(-3)内的表达式,之后他没有找到任何操作(+,*,/,-例如)所以下一个括号意味着这个是一个演员。

于 2013-05-07T07:13:35.917 回答
-1

没有歧义,编译器总是期望 Class 或变量,没有适合两者的操作。例如

    Integer Integer  = 1;
    Integer = new Integer(1);
    Integer = Integer  + 1;

1)在分配中总是有类型/变量名对

2) 你只能在 Class 上调用 new

3) 在算术运算中不能是任何类名

于 2013-05-07T07:03:22.207 回答