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