2014-12-08 1 views
0

Java 클래스에서 인수를 사용하지 않는 메서드를 호출하려고 시도하고 있습니다.하지만이를 수행 할 때 "필드 [methodName]에 대한 참조를 사용할 수 없습니다. 해결됨 ".Clojure에서 인수없이 Java 인스턴스 메서드 호출

이 기사에 따르면 Java interop (http://clojure.org/java_interop)의 Clojure 문서 "인스턴스 구성원 양식은 필드와 메소드 모두에서 작동합니다." 방법을 원한다는 것을 어떻게 알 수 있습니까? 그것은 내가 필드를 원한다는 args를 전달하지 않기 때문에 가정하는 것으로 보인다.

+0

코드의 모양은 무엇입니까? 당신이 faren.bar() 대신 foo.bar를 지정하면 Java가 비슷한 불만을 가질 것이라고 확신한다. – noisesmith

답변

2

필드와 메소드가 모두있는 경우 (.member instance) 양식이 메소드를 호출합니다 (보다 일반적입니다). 필드에 강제로 액세스하려는 경우 (.-field instance) 양식은 필드 값만 검색합니다.

예상대로 작동하지 않는 예제가있는 경우 코드 또는 오류를 확인하는 것이 도움이됩니다.

Clojure 컴파일러가 알 수없는 인스턴스 클래스 나 매개 변수 유형으로 메소드를 찾을 수없는 경우 오류 메시지가 필드를 찾고 있음을 표시하지만 이는 주문의 인공물에 불과합니다. 옵션 평가. 때로는 반사 경고를 켜면 문제를 더 정확하게 나타낼 수 있습니다.

0

다음은 예입니다. 문자열로 초기화 된 Java 클래스 인 StringBuilder를 만듭니다. 그런 다음 매개 변수가없는 메소드 인 reverse가 호출되고 결과는 toString 메소드를 호출하여 String으로 변환됩니다. 그것은, 그 상태를 유지하는 결과로서, 제 반대 첫번째 롤백 있도록

user=> (def sb (java.lang.StringBuilder. "Hello World")) 
;; #'user/sb 
user=> (.toString (.reverse sb)) 
;; "dlroW olleH" 
user=> (.toString (.reverse sb)) 
;; "Hello World" 
user=> 

StringBuilder 내 오브젝트는 변경 가능한 것이다. 이것은 Clojure와 같지 않으므로주의해서 사용해야합니다.

관련 문제