Java 8 + Groovy 2.4.12가 있으며 컴파일 및 실행되는 코드가 있습니다.Groovy 호출 일반 메소드가 컴파일되지 않습니다.
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
}
}
}
}
은 그러나 당신이 return
을 주석 경우, 컴파일러는 당신이 xyz
값 할당을 주석하는 경우, 그것은 다시 괜찮아, 또한에
Groovy:[Static type checking] - Cannot call <T> Bar#foo(T, java.util.function.Consumer <T>) with arguments [java.lang.String, groovy.lang.Closure
을 말한다. 그래서, 아래 코드는 컴파일 및 실행은 :
@CompileStatic
주석을- 두 개의 매개 변수를 사용하여 일반적인 방법;
['a','b'].each { int xyz // xyz = 1 foo('') { println '1' // return } }
이 당신이 가지고있는 경우에만 발생하는 특수한 상태를 보인다 첫 번째는 제네릭 형식이고 다른 하나는 동일한 제네릭 형식의 인터페이스 인 입니다.
- 해당 일반 메서드를 호출하고, 두 번째 인수는 다른 닫힘으로 래핑됩니다.
- 전화 (
int xyz = 1
같은 차이가 없습니다 경우 두 개의 라인 또는 한 줄에)
내 질문은 전에 변수 선언 및 값 할당; 이 컴파일러 버그 또는 return
문없이 컴파일하지 않는 이유는 합리적인 이유는 무엇입니까? 아니면 왜 변수 정의를 추가하는 것이 중단됩니까?
클로저를 'Consumer'로 캐스팅해야합니다. – cfrick
@cfrick 예, 가능한 해결 방법 중 하나입니다. 하지만 오히려 이것이 컴파일러에서 예상되는 동작인지 또는 버그인지 알고 싶었습니다. Jeff는 아파치에게 JIRA 티켓을 제출 했으므로 나는 그들의 의견을 기다릴 것입니다. 그래도 고마워. –