com.sun.tools.javac.code(javac编译器)包中的这种奇怪的语法是什么?它是如何工作的?

时间:2017-04-11 04:45:34

标签: java compilation javac

我正在查看一些内部javac sun编译器API源代码,并在Types类中遇到过这个问题:

public Boolean visitTypeVar(TypeVar var1, Type var2) {
         switch(null.$SwitchMap$com$sun$tools$javac$code$TypeTag[var2.getTag().ordinal()]) {
         case 12:
            if(Types.this.isSubtype(var1, var2)) {
               return Boolean.valueOf(true);
            } else {
               if(Types.this.isCastable(var1.bound, var2, Types.this.noWarnings)) {
                  ((Warner)Types.this.warnStack.head).warn(LintCategory.UNCHECKED);
                  return Boolean.valueOf(true);
               }

               return Boolean.valueOf(false);
            }
         case 13:
         case 16:
            return Boolean.valueOf(true);
         case 14:
         case 15:
         default:
            return Boolean.valueOf(Types.this.isCastable(var1.bound, var2, (Warner)Types.this.warnStack.head));
         }
      }

这是本声明中有趣的第二行:

null.$SwitchMap$com$sun$tools$javac$code$TypeTag[var2.getTag().ordinal()]

看起来它返回一个整数。这是如何工作的?

1 个答案:

答案 0 :(得分:1)

这只是你的反编译器的一些奇特的神器。

如果您以源代码形式(http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/com/sun/tools/javac/code/Types.java#1658)查看相同的代码,它只是枚举上的switch语句:

        @Override
        public Boolean visitTypeVar(TypeVar t, Type s) {
            switch (s.tag) {
            case ERROR:
            case BOT:
                return true;
            case TYPEVAR:
                if (isSubtype(t, s)) {
                    return true;
                } else if (isCastable(t.bound, s, Warner.noWarnings)) {
                    warnStack.head.warn(LintCategory.UNCHECKED);
                    return true;
                } else {
                    return false;
                }
            default:
                return isCastable(t.bound, s, warnStack.head);
            }
        }