有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java语法中用于区分>>(右移运算符)和嵌套泛型List<List<String>>的技巧

Possible Duplicate:
What trick does Java use to avoid spaces in >>?

C++中,嵌套参数需要额外的空格,因此可以看到如下情况:

List< List<String> >

Java中,不需要空格,可以这样写:

List<List<String>>

如果愿意,您可以使用额外的空格,但这不是必需的。(在C++中,一个问题 由于不带空格的>>表示右移位运算符而产生。Java修复了 (通过语法中的一个技巧解决问题。)

有谁能解释一下java语法中用来解决这个问题的诀窍是什么


共 (3) 个答案

  1. # 1 楼答案

    我的猜测(我会这样做)是Java在解析代码时寻找配对,例如(),{},[],<>>><&书信电报;是成对的

    因此,在解析代码时,如果该对中的第一个字符已经被读取,那么它会继续寻找该对中的第二个字符,一旦找到,它就会从下一个字符开始处理

    所以当它看到第一个>;在List<List<String>>中,它认为这是第二个<;等等

    <> P>我认为C++也可以做这样的事情,但是他们更喜欢可读性……p>
  2. # 2 楼答案

    假设java使用实际语法,而不是一些手工编码的令牌提取不匹配(安全的假设),这是因为分析器试图找到参数化的结束,并且不考虑第二角度括号。

    这里有一个可能的语法(不太可能是实际使用的语法,而且我已经多年没有为任何东西编写语法了,所以任何想要编辑的人都应该感到自由):

    typeref          : classname
                     | classname paramaterization
    
    parameterization : '<' typeref '>'
    

    只有某些地方可以发生typeref:变量/参数声明、强制转换,或紧跟new运算符。解析器看到了开头的尖括号,因此知道它正在处理一个参数化类型。该参数化以一个闭合角括号结束

    然而,这个定义是递归的。如果它看到另一个开口角括号,它就知道它在另一个参数化中。然而,内部参数化再次以一个闭合角括号结束

  3. # 3 楼答案

    java语言规范与C++ ++的问题相同

    http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.2

    The longest possible translation is used at each step, even if the result does not ultimately make a correct program while another lexical translation would.

    Thus, the input characters a b are tokenized (§3.5) as a, , b, which is not part of any grammatically correct program, even though the tokenization a, -, -, b could be part of a grammatically correct program.

    这意味着根据规范>>应该始终被识别为一个标记,而不是两个>

    这可能是一个(微不足道的)规范错误,因为Java阵营中没有人真正遵循这一点