2017-12-29 17 views
0

Ich habe Java 8 + Groovy 2.4.12 und Code unten kompiliert und läuft.Groovy Aufruf generische Methode kompiliert nicht

import java.util.function.Consumer 
import groovy.transform.CompileStatic 

@CompileStatic 
class Bar { 

    public static <T> void foo(T a, Consumer<T> c) { c.accept(a) } 

    static void main(args) { 
     ['a','b'].each { 
      int xyz 
      xyz = 1 
      foo('') { 
       println '1' 
       return 
      } 
     } 
    } 
} 

Aber wenn man die return Kommentar aus, Compiler sagt

Groovy:[Static type checking] - Cannot call <T> Bar#foo(T, java.util.function.Consumer <T>) with arguments [java.lang.String, groovy.lang.Closure 

Weiterhin, wenn Sie die xyz Wertzuweisung Kommentar aus, dann ist es wieder in Ordnung. Also, folgende Code kompiliert und ausgeführt:

['a','b'].each { 
    int xyz 
// xyz = 1 
    foo('') { 
     println '1' 
    // return 
    } 
} 

Dies scheint eine besondere Bedingung, die nur dann auftritt, wenn Sie haben:

  • @CompileStatic Anmerkung
  • eine generische Methode mit zwei Parametern; der erste ist ein generischer Typ und zweiter ist eine Schnittstelle des gleichen generischen Typs
  • Aufruf an diese generische Methode, zweites Argument als Schließung, alles in einem anderen Abschluss gewickelt.
  • eine Variablendeklaration und Wertzuweisung vor dem Aufruf (keinen Unterschied, wenn auf zwei getrennten Linien oder auf einzelne Linie, wie int xyz = 1)

Meine Frage ist; ist das ein Compiler Bug oder gibt es einen rationalen Grund, warum es nicht kompiliert ohne return Anweisung, aber kompiliert es? Oder warum das Hinzufügen von Variablendefinition es bricht?

+0

Ich denke, Sie müssen Ihre Schließung auf "Consumer" – cfrick

+0

@crfrick werfen Ja, das ist eine mögliche Problemumgehung. Aber ich wollte lieber wissen, ob dies ein erwartetes Verhalten oder ein Fehler im Compiler ist. Jeff hat ein JIRA Ticket an Apache geschickt, also werde ich auf ihre Meinung warten. Trotzdem danke. –

Antwort

0

Meine Frage ist; ist das ein Compiler-Fehler oder gibt es einen rationalen Grund , warum es nicht ohne return-Anweisung kompiliert, sondern kompiliert?

Das ehemalige.

+0

https://issues.apache.org/jira/browse/GROOVY-8427 –

Verwandte Themen