2010-05-18 11 views
7

Sto tentando di utilizzare deftype (dal ramo di clojure 1.2 bleeding) per creare una classe java che implementa l'interfaccia java Servlet. Mi aspetto che compaia il codice qui sotto (anche se non è molto utile).Come posso definire un tipo clojure che implementa l'interfaccia servlet?

(ns foo [:import [javax.servlet Servlet ServletRequest ServletResponse]]) 

(deftype servlet [] 
    javax.servlet.Servlet 
    (service [this 
     #^javax.servlet.ServletRequest request 
     #^javax.servlet.ServletResponse response] 
    nil)) 

Ma non viene compilato. Il compilatore produce il messaggio:

Mismatched return type: service, expected: void, had: java.lang.Object 
    [Thrown class java.lang.IllegalArgumentException] 

Quale non ha senso per me, perché sto tornando nullo. Quindi il fatto che il tipo di restituzione del metodo sia nullo non dovrebbe essere un problema. Ad esempio, per l'interfaccia java.util.Set:

(deftype bar [#^Number n] java.util.Set (clear [this] nil)) 

compila senza emissione.

Quindi, cosa sto facendo male nell'interfaccia Servlet?

Per essere chiari: So che il caso tipico è quello di sottoclasse una delle classi di astrazione servlet anziché implementare direttamente questa interfaccia, ma dovrebbe essere ancora possibile farlo.

dello stack:

L'analisi dello stack per il (servlet DEFTYPE ... è:

Mismatched return type: service, expected: void, had: java.lang.Object 
    [Thrown class java.lang.IllegalArgumentException] 

Restarts: 
0: [ABORT] Return to SLIME's top level. 

Backtrace: 
    0: clojure.lang.Compiler$NewInstanceMethod.parse(Compiler.java:6461) 
    1: clojure.lang.Compiler$NewInstanceExpr.build(Compiler.java:6119) 
    2: clojure.lang.Compiler$NewInstanceExpr$DeftypeParser.parse(Compiler.java:6003) 
    3: clojure.lang.Compiler.analyzeSeq(Compiler.java:5289) 
    4: clojure.lang.Compiler.analyze(Compiler.java:5110) 
    5: clojure.lang.Compiler.analyze(Compiler.java:5071) 
    6: clojure.lang.Compiler.eval(Compiler.java:5347) 
    7: clojure.lang.Compiler.eval(Compiler.java:5334) 
    8: clojure.lang.Compiler.eval(Compiler.java:5311) 
    9: clojure.core$eval__4350.invoke(core.clj:2364) 
10: swank.commands.basic$eval_region__673.invoke(basic.clj:40) 
11: swank.commands.basic$eval_region__673.invoke(basic.clj:31) 
12: swank.commands.basic$eval__686$listener_eval__687.invoke(basic.clj:54) 
13: clojure.lang.Var.invoke(Var.java:365) 
14: foo$eval__2285.invoke(NO_SOURCE_FILE) 
15: clojure.lang.Compiler.eval(Compiler.java:5343) 
16: clojure.lang.Compiler.eval(Compiler.java:5311) 
17: clojure.core$eval__4350.invoke(core.clj:2364) 
18: swank.core$eval_in_emacs_package__320.invoke(core.clj:59) 
19: swank.core$eval_for_emacs__383.invoke(core.clj:128) 
20: clojure.lang.Var.invoke(Var.java:373) 
21: clojure.lang.AFn.applyToHelper(AFn.java:169) 
22: clojure.lang.Var.applyTo(Var.java:482) 
23: clojure.core$apply__3776.invoke(core.clj:535) 
24: swank.core$eval_from_control__322.invoke(core.clj:66) 
25: swank.core$eval_loop__324.invoke(core.clj:71) 
26: swank.core$spawn_repl_thread__434$fn__464$fn__465.invoke(core.clj:183) 
27: clojure.lang.AFn.applyToHelper(AFn.java:159) 
28: clojure.lang.AFn.applyTo(AFn.java:151) 
29: clojure.core$apply__3776.invoke(core.clj:535) 
30: swank.core$spawn_repl_thread__434$fn__464.doInvoke(core.clj:180) 
31: clojure.lang.RestFn.invoke(RestFn.java:398) 
32: clojure.lang.AFn.run(AFn.java:24) 
33: java.lang.Thread.run(Thread.java:637) 

risposta

20

provare senza alcun suggerimento tipo:

(deftype servlet [] 
    javax.servlet.Servlet 
    (service [this request response] 
    ...body...)) 

Da the web page about deftype:

  • se si lascia fuori tutti i suggerimenti: cercherà per abbinare il stesso metodo Nome/arity in interfaccia (s)

    • questo è preferito
    • se si fornisce alcun suggerimento a tutti, senza inferenza è fatto, quindi tutti i suggerimenti (o predefinita dell'oggetto) deve essere corretto, per entrambi gli argomenti e ritornare tipo

E da (doc deftype):

Se non viene fornito, saranno dedotte, quindi digitare i suggerimenti dovrebbe essere riservato per disambiguazione.

+0

Ah, perfetto. Questo risponde a tutto, grazie. –

Problemi correlati