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编译器必须处理类似的问题,我知道how they deal with it,但Java似乎更宽容。
答案 0 :(得分:2)
“Java编程语言保证运算符的操作数似乎以特定的评估顺序进行评估,即从左到右。”
(Integer) -Integer
现在解析它时,很明显有一个减法运算符,(Integer)
和Integer
作为操作数。从左边开始,括号表达式应该被计算为一个值(因为它后跟和运算符),因此它不会假设为Type而是变量。
(Integer) (-Integer)
当解析它时,有两个标记(每个标记在括号内)没有任何运算符,因此没有歧义(表达式是值还是类型)。第一个括号将始终是Type和后跟的表达式将始终计算为要转换的值。
答案 1 :(得分:0)
据我所知,解析器从右到左。 第一个陈述是显而易见的。
在第二个语句中,解析器首先找到一个变量,然后在该符号后面的表达式“ - ”表示另一个变量,但是他找到了一个右括号,这意味着他首先需要解析括号中的表达式。在您的示例中,只有变量。因此解析器获取值并使用另一个变量对其进行subtrakt。
在第三个语句中,解析器首先找到右括号=>他将解析bracoets(-3)中的表达式,之后他没有找到任何操作(+,*,/, - 例如),所以下一个braket意味着这是一个Cast。
答案 2 :(得分:-1)
没有歧义,编译器总是期望Class或变量,没有适合的操作。 E.g。
Integer Integer = 1;
Integer = new Integer(1);
Integer = Integer + 1;
1)在assigment中总是有类型/变量名称对
2)你只能在一个班级
上打电话给新人3)在算术运算中不能是任何类名