Java语法歧义

Java语法歧义,java,casting,ambiguity,Java,Casting,Ambiguity,在Java中,我可以声明一个名为Integer的变量,然后编写代码,该代码可以是对Integer类的强制转换,也可以是涉及Integer变量的表达式。Java如何解决类名和变量名之间的歧义?规范中是否有正式规定?这是一个特别的启发性问题吗?我知道C编译器必须处理类似的问题,我也知道,但Java似乎更为宽容。没有歧义,编译器总是期望类或变量,没有适合两者的操作。例如 public class Ambiguity { public static void main(String[] args

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

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

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"
    }
}
1) 在assignment中始终存在类型/变量名对

2) 只能在类中调用new

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

请参阅

Java编程语言保证运算符的操作数按特定的求值顺序求值,即从左到右

现在,当解析它时,很明显存在一个减法运算符,它的操作数是
(Integer)
Integer
。从左边开始,括号表达式应该计算为一个值(后跟and运算符),因此它不会假定为类型,而是变量

(Integer) -Integer

解析时,有两个标记(每个标记位于括号内)没有任何运算符,因此没有歧义(表达式是值还是类型)。第一个括号将始终是类型和表达式,后面的表达式将始终计算为要强制转换的值

据我所知,解析器是从右向左的。 第一种说法是显而易见的

在第二条语句中,解析器首先找到一个变量,然后在该符号后面找到一个表达式“-”,他导出另一个变量,但他找到了一个右括号,这意味着他首先需要解析带括号的表达式。在您的示例中,只有变量。因此,解析器获取该值并将其与另一个变量进行子排序


在第三条语句中,解析器首先找到一个右括号=>他将解析brakets(-3)中的表达式,之后他没有找到任何运算符(+、*、/,-e.g.),因此下一个braket表示这是一个Cast。

您能分享更多详细信息吗?你读过关于自动装箱的文章吗?你需要发布我试过的代码,但网站不让我这么做。我将在编辑中再试一次。编辑:好的,现在有一个代码示例。你的问题很抽象。请举例说明。这将有助于社区提出清晰的解决方案。我可以理解,这可能只是您想知道的事情,但请注意,根据我所知道的Java编码标准,变量名应该以小写字母开头,类名应该以大写字母开头,所以这真的应该是一个问题。另外,不要给某个东西命名
Integer
/
Integer
(Integer)–Integer
在我看来,编译器可以将第一个
Integer
解释为类或变量。为什么?试着把双倍放进去它不起作用,(双倍)。。。糟糕的语法也许我应该改写我的问题。我知道,将变量命名为与类相同的变量并不会使变量和类之间有任何关系;我的问题是关于同名类和变量引起的解析歧义。特别是,编译器如何确定
(Integer)-Integer
是减法,而
(Integer)-Integer
是强制转换?
(Integer) -Integer
(Integer) (-Integer)