From e6c4855a930f670fc3db633443a8a61b8dc06db4 Mon Sep 17 00:00:00 2001 From: Liam Miller-Cushon Date: Mon, 19 Jan 2026 10:49:44 +0100 Subject: [PATCH] Only resolve object methods on interfaces --- .../sun/tools/javac/comp/LambdaToMethod.java | 14 ++++++++------ ...ableObjectMethodReferencesOnInterfaces.java | 18 ++++++++++++++++++ 2 files changed, 26 insertions(+), 6 deletions(-) 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 f9af7d7b803..3c9ec8ff938 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,12 +702,14 @@ public class LambdaToMethod extends TreeTranslator { String functionalInterfaceClass = classSig(targetType); String functionalInterfaceMethodName = samSym.getSimpleName().toString(); String functionalInterfaceMethodSignature = typeSig(types.erasure(samSym.type)); - 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(); + if (refSym.enclClass().isInterface()) { + 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(); diff --git a/test/langtools/tools/javac/lambda/SerializableObjectMethodReferencesOnInterfaces.java b/test/langtools/tools/javac/lambda/SerializableObjectMethodReferencesOnInterfaces.java index 27fb3ac9aa5..dfe4d64d1e3 100644 --- a/test/langtools/tools/javac/lambda/SerializableObjectMethodReferencesOnInterfaces.java +++ b/test/langtools/tools/javac/lambda/SerializableObjectMethodReferencesOnInterfaces.java @@ -63,9 +63,15 @@ public class SerializableObjectMethodReferencesOnInterfaces { R apply(T t); } + enum E { + ONE + } + void f() throws Exception { F f1 = I1::hashCode; F f2 = I2::hashCode; + F f3 = E::hashCode; + F f4 = Object::hashCode; } } @@ -91,6 +97,18 @@ public class SerializableObjectMethodReferencesOnInterfaces { getFunctionalInterfaceMethodSignature (Ljava/lang/Object;)Ljava/lang/Object; getImplClass java/lang/Object getImplMethodSignature ()I + getImplMethodKind 5 + getFunctionalInterfaceClass SerializableObjectMethodReferencesOnInterfaces$Test$F + getFunctionalInterfaceMethodName apply + getFunctionalInterfaceMethodSignature (Ljava/lang/Object;)Ljava/lang/Object; + getImplClass java/lang/Enum + getImplMethodSignature ()I + getImplMethodKind 5 + getFunctionalInterfaceClass SerializableObjectMethodReferencesOnInterfaces$Test$F + getFunctionalInterfaceMethodName apply + getFunctionalInterfaceMethodSignature (Ljava/lang/Object;)Ljava/lang/Object; + getImplClass java/lang/Object + getImplMethodSignature ()I """; if (!actual.equals(expected)) { throw new AssertionError(