Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8272715

Incorrect attribution of method invocations of Object methods on interfaces

XMLWordPrintable

    • Icon: CSR CSR
    • Resolution: Approved
    • Icon: P4 P4
    • 18
    • tools
    • None
    • behavioral
    • minimal
    • Java API, Class file construct
    • JDK

      Summary

      javac is producing suspicious results for code like (note toString is a mirror of a java.lang.Object method, the suspicious results only happen for methods that are mirror methods from java.lang.Object):

      interface I {
          public String toString();
          public String test();
      }
      interface J extends I {}

      The suspicious results are twofold:

      • Trees.isAccessible(..., I.toString, J) (i.e. accessibility check for I.toString as a member of J, in some scope/context) returns false. But I.toString is an inherited member of J and should be accessible under normal circumstances.
      • invocations like J j = null; j.toString(); will be attributed as referring to java.lang.Object.toString, rather than to I.toString (J.toString in classfile). This is observable either through the Trees.getElement API, or in the classfile

      In both cases, this is different from behavior where one would use test instead of toString.

      Problem

      As seen in the Summary section, javac is producing some suspicious results. A significant contributing factor is that javac's internal model uses java.lang.Object as the supertype of interface types.

      Solution

      The proposal is for javac's behavior w.r.t. methods mirroring java.lang.Object methods and superinterface methods to be consistent.

      Specification

      The proposal is that, in the above example:

      • Trees.isAccessible(..., I.toString, J) will return true
      • invocations of java.lang.Object methods on interfaces in the classfile will use invokeinterface referring to the interface, which is consistent with JLS 9.2. This will be done regardless of whether the interface declares the method explicitly or not.

            jlahoda Jan Lahoda
            jlahoda Jan Lahoda
            Vicente Arturo Romero Zaldivar
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

              Created:
              Updated:
              Resolved: