2010-05-22 3 views
3

groovy의 스크립팅 구문을 사용하여 속성을 할당하지만 특정 케이스에 문제가있는 경우 편리합니다. 나는 여기서 간단한 것을 놓치고 있어야합니다. 그래서 같은 클래스 A, B, C를 정의 : 다음Groovy의 메소드 오버로드

class A { 

    A() { 
     println "Constructed class A!" 
    } 

} 

class B { 

    B() { 
     println "Constructed class B!" 
    } 

} 

class C { 

    private member 

    C() { 
     println "Constructed class C!" 
    } 

    def setMember(A a) { 

     println "Called setMember(A)!" 
     member = a 

    } 

    def setMember(B b) { 

     println "Called setMember(B)!" 
     member = b 

    } 

} 

그리고 스크립트에서 다음 통화 시도 :

c = new C() 

c.setMember(new A()) // works 
c.member = new A() // works 

c.setMember(new B()) // works 
c.member = new B() // doesn't work! 

오류의 마지막 할당 결과 : '클래스 B의 개체를 캐스팅 할 수 없음을 클래스 A "와 같은 클래스 B에 대한 적절한 setMember 메서드를 호출하지 않는 이유는 무엇입니까?

+1

있지만, 올바른 접근 방식은 그렇게하지 않습니다! 다른 매개 변수 유형에 대해 다른 메소드를 작성하거나 유형이 공통 인터페이스를 구현하도록하십시오. 메소드 오버로딩은 최상의 때에 악하지만, Groovy의 느슨한 타이핑은 철저히 악마 적입니다. –

답변

2

점의 표기법을 사용하여 속성의 setter 메서드를 호출하는 바로 가기는 형식 검사를 수행하지 않습니다. 지정된 이름의 메서드 목록에서 첫 번째 항목을 사용하여 호출하는 것 같습니다.

Groovy의 속성 처리의 단점에 대해 Pyrasun's 확장 설명을 읽을 수도 있습니다.

이 동작을 무시하려면 Groovy가 메소드 호출에 대한 유형 점검을 지원하므로 설정기를 직접 호출해야합니다. 또는 당신은 또한

[email protected] = new B()

를 사용하여 세터없이 직접 필드에 액세스 할 수 있습니다 또는 당신은 하나의 setter 메소드에서 직접 검사 유형을 수행

def setMember(def param) { 
    if (param instanceof A) println "Called setMember(A)!" 
    if (param instanceof B) println "Called setMember(B)!" 

    member = param 
} 
크리스토프의 대답은 정확
관련 문제