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?
Ich denke, Sie müssen Ihre Schließung auf "Consumer" – cfrick
@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. –