diff -r c2dfab9e2f39 -r 85fecace920b src/share/classes/com/sun/tools/javac/code/Symbol.java --- a/src/share/classes/com/sun/tools/javac/code/Symbol.java Wed Jul 29 13:26:26 2009 -0700 +++ b/src/share/classes/com/sun/tools/javac/code/Symbol.java Thu Jul 30 10:29:53 2009 +0100 @@ -1197,21 +1197,9 @@ * as possible implementations. */ public MethodSymbol implementation(TypeSymbol origin, Types types, boolean checkResult) { - for (Type t = origin.type; t.tag == CLASS || t.tag == TYPEVAR; t = types.supertype(t)) { - while (t.tag == TYPEVAR) - t = t.getUpperBound(); - TypeSymbol c = t.tsym; - for (Scope.Entry e = c.members().lookup(name); - e.scope != null; - e = e.next()) { - if (e.sym.kind == MTH) { - MethodSymbol m = (MethodSymbol) e.sym; - if (m.overrides(this, origin, types, checkResult) && - (m.flags() & SYNTHETIC) == 0) - return m; - } - } - } + MethodSymbol res = types.implementation(this, origin, types, checkResult); + if (res != null) + return res; // if origin is derived from a raw type, we might have missed // an implementation because we do not know enough about instantiations. // in this case continue with the supertype as origin.