Uploaded image for project: 'Groovy'
  1. Groovy
  2. GROOVY-10272

Wrong inference when using ternary operator with lambdas

    XMLWordPrintableJSON

Details

    Description

      I have the following Groovy program.

      import java.util.function.Function;
      
      @groovy.transform.TypeChecked
      class Main {
          public static final void main() {
              Function<Long, Double> x
              // Works
              if (true) {
                  x = {Long a -> (Double) a}
              } else {
                  x = {Long b -> (Double) b}
              }
              // Fails
              Function<Long, Double> y = ((true) ? {Long a -> (Double) a} : {Long b -> (Double) b})
          }
      }
      

      Actual Behavior

      The program does not compile, and I get the following error.

      org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
      Main.groovy: 16: [Static type checking] - Cannot assign value of type java.lang.Double to variable of type java.util.function.Function<java.lang.Long, java.lang.Double>
       @ line 16, column 36.
                 Function<Long, Double> y = ((true) ? {Long a -> (Double) a} : {Long b -> (Double) b})
                                            ^
      
      1 error
      
      

      Note that the computed type is the return type of the lambdas.

      Expected Behavior

      Compile successfully.

      Comment

      Tested against 4-beta-1, 4-alpha-3, 3.0.9, and master (commit: b26dbbeabe1e3d27d30c936701b1a571e24d5ab2). Maybe similar to GROOVY-10271.

      Attachments

        Issue Links

          Activity

            People

              emilles Eric Milles
              schaliasos Stefanos Chaliasos
              Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: