2010-05-18 3 views
7

Я пытаюсь использовать deftype (от ветви clojure 1.2 от кровотечения), чтобы создать класс java, который реализует интерфейс сервлета java. Я бы ожидал, что код ниже будет компилироваться (хотя это не очень полезно).Как определить тип clojure, реализующий интерфейс сервлета?

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

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

Но он не компилируется. Компилятор выдает сообщение:

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

Это не имеет смысла для меня, потому что я возвращаю ноль. Поэтому проблема с возвратом типа метода не должна быть проблемой. Например, для интерфейса java.util.Set:

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

компилируется без проблем.

Так что я делаю неправильно с интерфейсом 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) 

ответ

20

Try без каких-либо намеков типа:

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

От the web page about deftype:

  • если оставить все намеки: будет пытаться в соответствии с таким же способом, имя/валентности в интерфейс (ы)

    • это предпочтительно
    • если вы предоставляете какие-либо намеки на всех, нет вывод делается, поэтому все намеки (или по умолчанию объекта) должен быть правильным, для обоих аргументов и тип возвращаемого

И от (doc deftype):

Если не указано, то они будут выведены, поэтому тип подсказка должна быть зарезервирована для устранения неоднозначности.

+0

Ах, отлично. Это все отвечает, спасибо. –

Смежные вопросы