2012-09-18 2 views
1

Groovy 2.0에서 optional static checking을 트리거하는 클래스 또는 메소드에 TypeChecked 주석을 추가 할 수 있습니다.Groovy mixed typing

나는 그런 것들이 어떻게 작동하는지 혼란 스럽다는 것을 인정해야한다. 이 기사에서는 간단한 예제를 제공합니다.

@TypeChecked 
Date test() { 
    // compilation error: 
    // cannot assign value of Date 
    // to variable of type int 
    int object = new Date() 

    String[] letters = ['a', 'b', 'c'] 
    // compilation error: 
    // cannot assign value of type String 
    // to variable of type Date 
    Date aDateVariable = letters[0] 

    // compilation error: 
    // cannot return value of type String 
    // on method returning type Date 
    return "today" 
} 

이 경우 일부 검사가 실패합니다. 그러나 일반적으로, 검사 된 타입 B 안에, 타입이 체크되지 않은, 메소드 A의 리턴 값을 사용할 것입니다. 이 경우에는 컴파일러가 메서드 B 형식이 일관되는지 여부를 알아낼 수있는 방법이 표시되지 않습니다.이 메서드는 A 메서드의 반환 값에 대한 정보가 충분하지 않기 때문입니다.

일반적으로 유형 안전성을 유지하면서 코드 서브 세트에서 유형 확인을 사용하려면 어떻게해야합니까?

편집

나는 예를 만들려고. 내가 늙은 클래스를

class Old { 
    public getFoo() { 
    return 1 
    } 
} 

을 가지고

@TypeChecked 
class New { 
    int doubleFoo() { 
    return 2 * (new Old().foo) 
    } 
} 

컴파일러와 같은 유형 검사 코드에서 사용하려고하면 단지 무엇을 알고, 나는 그것이 실패합니다 생각하지 않습니다 무엇 컴파일 (Groovy2를 점검 할 작업에 여기에 설치하지 않았습니다). 그러나이 경우 Groovy2 이전에 작성된 코드를 사용하는 것이 문제가됩니다. 그래서 나는 더 정교한 것이 행해졌다고 생각하지만, 나는 무엇을 확신 할 수 없다.

답변

1

그런 문제는 없습니다. 검사되지 않은 클래스에서 메서드를 호출하면 선언 된 반환 형식이 사용되며 Groovy의 Java 메서드를 사용하는 경우와 동작이 동일합니다.

는 다음과 같은 예를 보자 이제

class A { 
    int foo() { 1 } 
} 

@TypeChecked 
class B { 
    void bar() { 
     int x = new A().foo() // uses the type from A.foo, correct 
    } 
} 

을,이 상상 :

class A { 
    Date foo() { new Date() } 
} 

@TypeChecked 
class B { 
    void bar() { 
     int x = new A().foo() // uses the type from A.foo, foo returns a Date, the compiler throws an error 
    } 
} 

주 당신이에 크게 의존하는 코드가있는 경우 일반적으로, 당신은 하나의 클래스에 혼합 된 유형 검사를 사용하는 것이 유형 검사기가 분명히 확인할 수없는 동적 코드. 예를 들어 빌더에 의존하는 경우입니다. 그렇다면 빌더를 검사하지 않은 채 사용하는 메소드를 선언하고 나머지 코드는 검사합니다. 체크되지 않은 메서드가 호환 가능한 형식을 반환하는 한 유형 안전이 보장됩니다.

+0

사실, typechecked되지 않는 전형적인 그루비 클래스는'def foo() {1}'과 같은 것을 가질 것입니다. AFAIK, 이것은'Object'를 반환하는 것과 같아야합니다. 자, 예를 들어,이 결과를'int' (또는'Integer', boxing 후)를 기대하는 typechecked 메소드에 넣으려고하면, 타입 검사기가 불평 할 것입니다. – Andrea

+0

Groovy에 대한 내 경험이 대표적인 것은 아니지만, 리턴 타입을 명시 적으로 선언하지 않고'def'를 사용하는 많은 코드를 발견했습니다. 어떤 경우라도 Groovy 1에서 반환 형식을 선언하면 런타임에 형식 검사를하지 않아 코드가 더 이상 안전하지 않게되고 결과적으로 인해 버그가 숨겨지기 때문에이 방법을 사용하는 것이 좋습니다. 주조가 더 느리다. – Andrea

+0

동적 언어는 대개 조금 더 느립니다. groovy는 빠른 동적 언어이므로 사례를 확인해야합니다. 최대 성능이 필요합니까? groovy를 사용하여 웹 애플리케이션을 2 년 동안 사용해 왔습니다. 대부분의 문제는 JPA에서의 높은 JSF 1.2 메모리 사용 및 잘못된 매핑에서 비롯되었습니다. 최대의 성능이 필요하면'@ CompileStatic'. 타입 검사가 필요하다면, 당신이 당신의 메소드의 서명을 입력해야한다는 것이 옳다고 생각합니다. 그렇지 않으면'def'로 갈 수 있습니다. 귀하의 경우, 컴파일러는 메서드의 반환 형식을 유추 생각하지 않습니다. 어쩌면 JIRA를 채우고 있을까요? – Will