2013-03-30 2 views
1

오버로드 방법과 인터페이스 할 때 Clojure의 세대 수준을 발생ArityException 내가 다음과 같은 자바 인터페이스를

public interface Wrapper { 
    void error(Exception e); 
    void error(String str); 
} 

그리고 난 발전기 클래스 Clojure에서의 구현을 만들려고 오전 :

(ns myimpl) 

(gen-class 
:name myimpl 
:implements [Wrapper] 
:state state 
:init init 
:prefix "w-" 
:main false 
) 


(defn- w-error [this ^Exception e] 
    (println e)) 

(defn- w-error [this ^String s] 
    (println s)) 

그럼 내가 REPL에서 방법을 인스턴스를 생성하고 호출 할 :

> (def w (myimpl.)) 
> (.error w "oops") 

이 나를 Arit에게 줄 것이다 yException : 잘못된 수의 args (2)가 다음과 같이 전달되었습니다. myimpl $ w-error.

내가 여기서 잘못 했습니까?

답변

0

다음 코드는 Clojure 함수가 어떻게 작동하는지 오해 한 것입니다. defn 정의

(defn- w-error [this ^Exception e] 
    (println e)) 

(defn- w-error [this ^String s] 
    (println s)) 

"보통"기능 유형에 파견 할 수 - 인수 만의 수.

은 그게 실제로 유용하고 실현 가능한 기능이 될 것 보라,하지만 우리는 multimethods프로토콜 구현 함께 형 파견 요구에 80 %의 경우를 포함 대신 해결해야합니다.

나는 왜 당신이 특별히 아리따 예외를 얻는 지 모르겠다. 그러나 나는 그것이별로 중요하지 않다고 말할 것이다.

마지막으로 Java에서 Java 인터페이스를 구현하고 실제 기능을 Clojure 코드에 위임 할 수 있습니다. Clojure 프로젝트를 AOT 컴파일하거나 RT, Var 등의 코드를 동적으로로드해야합니다.

관련 문제