2010-05-18 15 views
7

मैं जावा सर्वलेट इंटरफ़ेस लागू करने वाले जावा क्लास बनाने के लिए डेफटाइप (रक्तस्राव-किनारे क्लोजर 1.2 शाखा से) का उपयोग करने का प्रयास कर रहा हूं। मैं नीचे कोड को संकलित करने की अपेक्षा करता हूं (भले ही यह बहुत उपयोगी न हो)।मैं क्लोजर प्रकार को परिभाषित कैसे कर सकता हूं जो सर्वलेट इंटरफ़ेस लागू करता है?

(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)) 

मुद्दे के बिना संकलित करता है।

तो मैं सर्वलेट इंटरफ़ेस के साथ क्या गलत कर रहा हूं?

स्पष्ट होने के लिए: मुझे पता है कि सामान्य मामला सीधे इस इंटरफेस को लागू करने के बजाय सर्वलेट सार वर्गों में से एक को उप-वर्ग करना है, लेकिन यह अभी भी करना संभव है।

स्टैक ट्रेस: ​​

(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

प्रयास करें:

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

the web page about deftype से:

  • यदि आप सभी संकेत बाहर छोड़: इंटरफेस (रों) में एक ही नाम/arity पद्धति पर बनाने का प्रयास करेगा

    • इस पसंद किया जाता है
    • अगर आप किसी भी संकेत बिल्कुल आपूर्ति, कोई अनुमान किया जाता है, इसलिए सभी संकेत (या वस्तु की डिफ़ॉल्ट), सही होना चाहिए दोनों बहस के लिए और वापसी प्रकार

और (doc deftype) से:

अगर इसकी आपूर्ति नहीं वे अनुमान लगाया जा जाएगा, ताकि टाइप संकेत बहुविकल्पी के लिए आरक्षित किया जाना चाहिए।

+0

आह, सही। यह सब कुछ जवाब देता है, धन्यवाद। –

संबंधित मुद्दे

 संबंधित मुद्दे