diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java index 3f3eb1f9623..539b1470a75 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java @@ -2858,13 +2858,17 @@ public class Types { hasSameArgs(t, erasure(s)) || hasSameArgs(erasure(t), s); } - public boolean overridesObjectMethod(TypeSymbol origin, Symbol msym) { + public Symbol overriddenObjectMethod(TypeSymbol origin, Symbol msym) { for (Symbol sym : syms.objectType.tsym.members().getSymbolsByName(msym.name)) { if (msym.overrides(sym, origin, Types.this, true)) { - return true; + return sym; } } - return false; + return null; + } + + public boolean overridesObjectMethod(TypeSymbol origin, Symbol msym) { + return overriddenObjectMethod(origin, msym) != null; } /** diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java index b13c9e0fe2b..f9af7d7b803 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java @@ -702,13 +702,12 @@ public class LambdaToMethod extends TreeTranslator { String functionalInterfaceClass = classSig(targetType); String functionalInterfaceMethodName = samSym.getSimpleName().toString(); String functionalInterfaceMethodSignature = typeSig(types.erasure(samSym.type)); - Symbol baseMethod = refSym.baseSymbol(); - Symbol origMethod = baseMethod.baseSymbol(); - if (baseMethod != origMethod && origMethod.owner == syms.objectType.tsym) { - //the implementation method is a java.lang.Object method transferred to an - //interface that does not declare it. Runtime will refer to this method as to - //a java.lang.Object method, so do the same: - refSym = ((MethodSymbol) origMethod).asHandle(); + Symbol baseMethod = types.overriddenObjectMethod(refSym.enclClass(), refSym); + if (baseMethod != null) { + // The implementation method is a java.lang.Object method, runtime will resolve this method to + // a java.lang.Object method, so do the same. + // This case can be removed if JDK-8172817 is fixed. + refSym = ((MethodSymbol) baseMethod).asHandle(); } String implClass = classSig(types.erasure(refSym.owner.type)); String implMethodName = refSym.getQualifiedName().toString();