2010-05-18 12 views
7

J'essaye d'utiliser deftype (à partir de la branche clojure 1.2) pour créer une classe java qui implémente l'interface java Servlet. Je m'attendrais à ce que le code ci-dessous compile (même si ce n'est pas très utile).Comment puis-je définir un type de clojure qui implémente l'interface de 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)) 

Mais il ne compile pas. Le compilateur produit le message:

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

Ce qui n'a pas de sens pour moi, parce que je retourne zéro. Donc le fait que le type de retour de la méthode soit nul ne devrait pas poser de problème. Par exemple, pour l'interface java.util.Set:

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

compile sans problème. Alors, qu'est-ce que je fais de mal avec l'interface Servlet? Pour être clair: Je sais que le cas typique est de sous-classer l'une des classes abstraites de servlets plutôt que d'implémenter cette interface directement, mais cela devrait toujours être possible.

Trace de pile:

La trace de pile pour le (servlet DEFTYPE ... est la suivante:

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) 

Répondre

20

essai sans aucun indice de type:

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

De the web page about deftype:

  • si vous laissez tous les conseils: va essayer pour correspondre à la méthode même nom/arité interface (s)

    • Ceci est préféré
    • si vous fournissez des conseils du tout, pas inférence est fait, si tous les indices (ou défaut d'objet) doit être correcte, pour les deux arguments et retourner le type

Et de (doc deftype):

Si non fourni, ils seront inférées, tapez donc des notes devraient être réservées aux homonymie.

+0

Ah, parfait. Cela répond à tout, merci. –