2017-12-29 61 views
0

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 문없이 컴파일하지 않는 이유는 합리적인 이유는 무엇입니까? 아니면 왜 변수 정의를 추가하는 것이 중단됩니까?

+0

클로저를 'Consumer'로 캐스팅해야합니다. – cfrick

+0

@cfrick 예, 가능한 해결 방법 중 하나입니다. 하지만 오히려 이것이 컴파일러에서 예상되는 동작인지 또는 버그인지 알고 싶었습니다. Jeff는 아파치에게 JIRA 티켓을 제출 했으므로 나는 그들의 의견을 기다릴 것입니다. 그래도 고마워. –

답변

0

내 질문은; 이것은 컴파일러 버그인가 아니면 합리적인 이유인가? return 문없이 컴파일되지 않고 컴파일되는 이유는 무엇입니까?

전자는

+0

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