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

Functional Interface ambiguous method call

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Not an Issue
    • Icon: P4 P4
    • None
    • 8u20
    • tools
    • x86
    • os_x

      FULL PRODUCT VERSION :
      java version "1.8.0_20"
      Java(TM) SE Runtime Environment (build 1.8.0_20-b26)
      Java HotSpot(TM) 64-Bit Server VM (build 25.20-b23, mixed mode)

      ADDITIONAL OS VERSION INFORMATION :
      Darwin user.local 13.3.0 Darwin Kernel Version 13.3.0: Tue Jun 3 21:27:35 PDT 2014; root:xnu-2422.110.17~1/RELEASE_X86_64 x86_64

      A DESCRIPTION OF THE PROBLEM :
      Given these functions:

      public static <In extends Number, Out extends Number> Out test(In in, Function<In, Out> f) {
          Out x = f.apply(in);
          return test(in, x);
      }

      public static <In extends Number, Out extends Number> Out test(In in, Out out) {
          return out;
      }

      The following call should work Test.test(1, Integer::new), however the following error is reported:

      Test.java:5: error: reference to test is ambiguous
          Test.test(2, Integer::new);
              ^
      both method <In#1,Out#1>test(In#1,Function<In#1,Out#1>) in Test and method <In#2,Out#2>test(In#2,Out#2) in Test match
      where In#1,Out#1,In#2,Out#2 are type-variables:
      In#1 extends Number declared in method <In#1,Out#1>test(In#1,Function<In#1,Out#1>)
      Out#1 extends Number declared in method <In#1,Out#1>test(In#1,Function<In#1,Out#1>)
      In#2 extends Number declared in method <In#2,Out#2>test(In#2,Out#2)
      Out#2 extends Number declared in method <In#2,Out#2>test(In#2,Out#2)

      The following works though:

      Test.test(2, new Function<Integer, Number>() {
          @Override
          public Number apply(Integer integer) {
             return 10;
          }
      });

      and

      Test.test(2, (Function<Integer, Number>) integer -> 10);

      Link to Stackoverflow question: http://stackoverflow.com/questions/25653204/java-8-functional-interface-ambiguous-reference-is-this-a-bug

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      import java.util.function.Function;

      public class Test {
        public static void main(String[] args) {
          Test.test(2, Integer::new);
        }

        public static <In extends Number, Out extends Number> Out test(In in, Function<In, Out> f) {
          Out x = f.apply(in);
          return test(in, x);
        }

        public static <In extends Number, Out extends Number> Out test(In in, Out out) {
          return out;
        }
      }

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      Successful compilation
      ACTUAL -
      Failed compilation

      ERROR MESSAGES/STACK TRACES THAT OCCUR :
      Test.java:5: error: reference to test is ambiguous
          Test.test(2, Integer::new);
              ^
      both method <In#1,Out#1>test(In#1,Function<In#1,Out#1>) in Test and method <In#2,Out#2>test(In#2,Out#2) in Test match
      where In#1,Out#1,In#2,Out#2 are type-variables:
      In#1 extends Number declared in method <In#1,Out#1>test(In#1,Function<In#1,Out#1>)
      Out#1 extends Number declared in method <In#1,Out#1>test(In#1,Function<In#1,Out#1>)
      In#2 extends Number declared in method <In#2,Out#2>test(In#2,Out#2)
      Out#2 extends Number declared in method <In#2,Out#2>test(In#2,Out#2)

      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------
      import java.util.function.Function;

      public class Test {
        public static void main(String[] args) {
          Test.test(2, Integer::new);
        }

        public static <In extends Number, Out extends Number> Out test(In in, Function<In, Out> f) {
          Out x = f.apply(in);
          return test(in, x);
        }

        public static <In extends Number, Out extends Number> Out test(In in, Out out) {
          return out;
        }
      }
      ---------- END SOURCE ----------

            vromero Vicente Arturo Romero Zaldivar
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved: