2010-05-18 13 views
7

Estoy tratando de usar deftype (desde la rama clojure 1.2 de última generación) para crear una clase java que implemente la interfaz Java Servlet. Esperaría que compile el siguiente código (aunque no sea muy útil).¿Cómo puedo definir un tipo de clojure que implemente la interfaz 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)) 

Pero no se compila. El compilador genera el mensaje:

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

Lo que no tiene sentido para mí, porque estoy volviendo a cero. Por lo tanto, el hecho de que el tipo de devolución del método sea nulo no debería ser un problema. Por ejemplo, para la interfaz java.util.Set:

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

compila sin problema.

Entonces, ¿qué estoy haciendo mal con la interfaz de Servlet?

Para ser claro: Sé que el caso típico es subclase de una de las clases abstractas de servlet en lugar de implementar esta interfaz directamente, pero todavía debería ser posible hacer esto.

Seguimiento de la pila:

El seguimiento de la pila para el (servlet DEFTYPE ... es:

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) 

Respuesta

20

Try sin ninguna pista de tipo:

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

De the web page about deftype:

  • si dejar de lado todas las pistas: intentará para que coincida con el mismo método Nombre/aridad en interfaz (s)

    • Esto se prefiere
    • si proporciona ninguna pista en absoluto, sin inferencia se realiza, por lo que todos los consejos (o por defecto de objeto) debe ser correcta, para ambos argumentos y volver tipo

Y a partir de (doc deftype):

Si no se proporciona, se pueden deducir, por lo que escribir consejos deben reservarse para la desambiguación.

+0

Ah, perfecto. Eso responde todo, gracias. –

Cuestiones relacionadas