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

Potential compatibility should not substitute explicit type args

    Details

      Description

      Per JLS 8 15.12.2.1, all lambdas and method references are considered potentially compatible with bare type arguments. But when there are explicit type arguments, javac appears to be substituting away the bare type argument before performing this check. This is incorrect. (The analysis is intentionally simple, avoiding things like subtyping and substitutions.)

      public class ExplicitFunctionArg {

          interface Sink<T> { void test(T arg); }

          <T> void m(T arg, java.io.Serializable x) {}
          <T> void m(Sink<T> arg, Cloneable x) {}

          void test() {
              this.<String>m(x -> {}, new int[0]);
              // expected: ambiguity error; actual: no error
          }

      }

      Reported by Jon Rafkind at lambda-spec-observers@openjdk.java.net.

        Attachments

          Activity

            People

            • Assignee:
              dlsmith Dan Smith
              Reporter:
              dlsmith Dan Smith
            • Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

              • Created:
                Updated: