2017-04-11 11 views
1

나는 유형 클래스에이를 통해 내부 javac의 태양 컴파일러 API 소스의 일부를 찾아왔다되었습니다com.sun.tools.javac.code 패키지 (javac 컴파일러)의 이상한 구문은 무엇이며 어떻게 작동합니까?

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()] 

어떤 그것은 정수를 반환하는 것처럼 보입니다. 이게 어떻게 작동합니까?

+0

아니 당신은하지 않았다. 당신은 디 컴파일 결과를보고있었습니다. 같은 것이 아닙니다. – EJP

답변

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); 
      } 
     } 
+0

유용한 사이트에 감사드립니다! –