मैं जावा सर्वलेट इंटरफ़ेस लागू करने वाले जावा क्लास बनाने के लिए डेफटाइप (रक्तस्राव-किनारे क्लोजर 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)
आह, सही। यह सब कुछ जवाब देता है, धन्यवाद। –