可能重复:
Java 使用什么技巧来避免 >> 中的空格?
在C++中,嵌套参数需要额外的空格,因此您会看到如下内容:
List< List<String> >
在Java中,不需要空格,可以这样写:
List<List<String>>
如果您愿意,可以使用额外的空格,但它们不是必需的。(在C++中,出现了一个问题,因为>>
没有空格表示右移运算符。Java 通过语法中的技巧解决了这个问题。)
任何人都可以解释java语法中用来解决问题的技巧是什么吗?
可能重复:
Java 使用什么技巧来避免 >> 中的空格?
在C++中,嵌套参数需要额外的空格,因此您会看到如下内容:
List< List<String> >
在Java中,不需要空格,可以这样写:
List<List<String>>
如果您愿意,可以使用额外的空格,但它们不是必需的。(在C++中,出现了一个问题,因为>>
没有空格表示右移运算符。Java 通过语法中的技巧解决了这个问题。)
任何人都可以解释java语法中用来解决问题的技巧是什么吗?
Java语言规范与C++有同样的问题
http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.2
每一步都使用尽可能长的翻译,即使结果最终不会产生正确的程序,而另一个词汇翻译会。
因此,输入字符 a--b 被标记化(第 3.5 节)为 a、-、b,这不是任何语法正确程序的一部分,即使标记化 a、-、-、b 在语法上可能是 a 的一部分正确的程序。
根据规范,这意味着>>
应始终被识别为一个令牌,而不是两个。>
这可能是一个(微不足道的)规范错误,因为 Java 阵营中没有人真正遵循这一点。
假设 Java 使用实际的语法,而不是一些手工编码的令牌提取不匹配(一个安全的假设),这是因为解析器试图找到参数化的结尾,并且它不考虑第二个尖括号。
这是一个可能的语法(不太可能是实际使用的语法,而且我已经多年没有为任何东西编写语法了,所以任何想要编辑的人都应该感到自由):
typeref : classname
| classname paramaterization
parameterization : '<' typeref '>'
只有某些地方typeref
会出现 a:变量/参数声明、强制转换或在new
运算符之后。解析器看到左尖括号,因此知道它正在处理参数化类型。该参数化以单个闭合尖括号结束。
但是,定义是递归的。如果它看到另一个开放的尖括号,它知道它在另一个参数化中。然而,再一次,内部参数化以单个右尖括号结束。
我的猜测(我会这样做)是 Java 在解析代码时查找对,例如 ()、{}、[]、<>、>>、<< 是对。
因此,在解析代码时,如果已经读取了该对中的第一个字符,那么它会继续寻找该对中的第二个字符,一旦找到,它就会从下一个字符开始处理。
所以当它看到第一个 > 时,List<List<String>>
它认为它是第二个 < 的补充,依此类推。
我认为 C++ 也可以做这样的事情,但他们更喜欢可读性... :)