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 7dab78102de..8a35a1c76c8 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 efc69f33417..e5d145afc8b 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; } } @@ -93,6 +99,20 @@ public class SerializableObjectMethodReferencesOnInterfaces { getImplClass java/lang/Object getImplMethodSignature ()I getInstantiatedMethodType (LSerializableObjectMethodReferencesOnInterfaces$Test$I2;)Ljava/lang/Integer; + getImplMethodKind 5 + getFunctionalInterfaceClass SerializableObjectMethodReferencesOnInterfaces$Test$F + getFunctionalInterfaceMethodName apply + getFunctionalInterfaceMethodSignature (Ljava/lang/Object;)Ljava/lang/Object; + getImplClass java/lang/Enum + getImplMethodSignature ()I + getInstantiatedMethodType (LSerializableObjectMethodReferencesOnInterfaces$Test$E;)Ljava/lang/Integer; + getImplMethodKind 5 + getFunctionalInterfaceClass SerializableObjectMethodReferencesOnInterfaces$Test$F + getFunctionalInterfaceMethodName apply + getFunctionalInterfaceMethodSignature (Ljava/lang/Object;)Ljava/lang/Object; + getImplClass java/lang/Object + getImplMethodSignature ()I + getInstantiatedMethodType (Ljava/lang/Object;)Ljava/lang/Integer; """; if (!actual.equals(expected)) { throw new AssertionError(