解讀Javac之Types方法2
阿新 • • 發佈:2017-10-01
with return simple tail site 接口 sub @override 組類型
2、 asSuper() 方法
/** * Return the (most specific) base type of t that starts with the * given symbol. If none exists, return null. * * @param t a type * @param sym a symbol */ public Type asSuper(Type t, Symbol sym) { return asSuper.visit(t, sym); }
asSuper對象的定義如下:
private SimpleVisitor<Type,Symbol> asSuper = new SimpleVisitor<Type,Symbol>() { public Type visitType(Type t, Symbol sym) { return null; } @Override public Type visitClassType(ClassType t, Symbol sym) { if (t.tsym == sym) return t; Type st = supertype(t); if (st.tag == CLASS || st.tag == TYPEVAR || st.tag == ERROR) { Type x = asSuper(st, sym); if (x != null) return x; } if ((sym.flags() & INTERFACE) != 0) { for (List<Type> l = interfaces(t); l.nonEmpty(); l = l.tail) { Type x = asSuper(l.head, sym); if (x != null) return x; } } return null; } @Override public Type visitArrayType(ArrayType t, Symbol sym) { return isSubtype(t, sym.type) ? sym.type : null; } @Override public Type visitTypeVar(TypeVar t, Symbol sym) { if (t.tsym == sym) return t; else return asSuper(t.bound, sym); } @Override public Type visitErrorType(ErrorType t, Symbol sym) { return t; } };
通過實現代碼可以了解到,對ClassType、ArrayType與TypeVariable進行了處理。其中在t及其父類和實現的接口中查找sym符號時,由於t為數組類型,所以符號只能是Clonable與Serializable
解讀Javac之Types方法2