Java使用什么技巧来避免>>中的空格?

2022-09-03 06:18:14

在Java Generic Book中,在对比C++模板和Java Generic之间的区别时说:

在C++中,会出现一个问题,因为没有空格的>>表示右移运算符。Java通过语法中的技巧解决了这个问题。

这是什么伎俩?


答案 1

OpenJDK javac 解析器 , 在解析类型参数时,会将词法分析器标记 ()、 、 ( ) 并放入带有少一个 '' 字符的标记中。JavacParserGTGTGTEQ>>>=GTGTEQGTEQGTGTGT>>>GTGT>

这是魔术的片段:JavacParser#typeArguments()

    switch (S.token()) {
    case GTGTGTEQ:
        S.token(GTGTEQ);
        break;
    case GTGTEQ:
        S.token(GTEQ);
        break;
    case GTEQ:
        S.token(EQ);
        break;
    case GTGTGT:
        S.token(GTGT);
        break;
    case GTGT:
        S.token(GT);
        break;
    default:
        accept(GT);
        break;
    }

人们可以清楚地看到,这确实是一个技巧,它在语法:)


答案 2

这实际上在下一个版本C++中得到了修复。真的没有太多的技巧;如果在解析泛型或模板的过程中遇到>>,而您希望>,那么您已经有足够的信息来生成错误消息。而且,如果您有足够的信息来生成错误消息,则也有足够的信息将>>解释为两个单独的标记:>后跟>。