से क्लोजर वैरिएडिक फ़ंक्शन को कॉल करने के लिए कैसे करें क्लोजर में एक वैरैडिक फ़ंक्शन घोषित करना संभव है जिसे जावा से एक varargs विधि कहा जा सकता है?जावा
विकास के तहत कुछ कोड के इस उद्धरण पर विचार करें:
(ns com.mydomain.expression.base
(:gen-class
:name com.mydomain.expression.Base
:methods [^:static [exprFactory [String String ?????] Object]]
)
(defn expr-factory
; worker function that is also called from Clojure
[id func & args]
(let [ex ("construction code here")]
ex))
(defn -exprFactory
; interface method called from Java
[idStr funcStr & argsArray]
(apply expr-factory idStr funcStr (seq argsArray)))
क्या मैं ?????
के स्थान पर डाल जावा exprFactory
विधि कॉल करने की अनुमति के लिए कर सकते हैं और पता करने के लिए यह एक varargs तरीका है कि है:
import com.mydomain.expression.Base;
...
Object e1 = Base.exprFactory("e1", "day");
Object e2 = Base.exprFactory("e2", "length", "string");
Object e3 = Base.exprFactory("e3", "*", 4, 5);
Object sum = Base.exprFactory("sum", "+", e1, e2, e3);
इस एक छोटे से स्पष्ट बनाने के लिए, मैं मैं ?????
के स्थान पर Object
का उपयोग जानते हैं और करने के लिए exprFactory
बदलने के लिए:
(defn -exprFactory
; interface method called from Java
[idStr funcStr argsArray]
(apply expr-factory idStr funcStr (seq argsArray)))
..लेकिन मतलब यह है कि मैं जावा इस तरह कहता है लिखने के लिए है:
import com.mydomain.expression.Base;
...
Object e1 = Base.exprFactory("e1", "day", new Object[0]));
Object e2 = Base.exprFactory("e2", "length", new Object[] { "string" }));
Object e3 = Base.exprFactory("e3", "*", new Integer[] { 4, 5 }));
Object sum = Base.exprFactory("sum", "+", new Object[] { e1, e2, e3 }));
फिर से, मैं जानता हूँ कि मुझे लगता है कि गैर variadic exprFactory
कॉल जावा में एक varargs आवरण विधि लिख सकता है, लेकिन मैं अगर संभव हो तो इससे बचने के लिए।
और ऑब्जेक्ट [] काम नहीं करता है? –
@andrew मैंने पहली कोशिश की थी, और मैंने ऑब्जेक्ट की भी कोशिश की ... जो जावा सिंटैक्स से मेल खाती है। –
क्योंकि varargs केवल कंपाइलर द्वारा धोखा देती है जो कि प्रकार हस्ताक्षर में एक सरणी की तरह दिखती है, आपको इसके साथ '' स्ट्रिंग [] '' निर्दिष्ट करने में सक्षम होना चाहिए: '' "[Ljava.lang.String;" ' '' ????? '' के बजाय '। मैंने कोशिश की, यह संकलित करता है, लेकिन ग्रहण varargs को पहचाना नहीं जाएगा, यह एक '' स्ट्रिंग [] '' एक जावा वर्ग के रूप में भी जोर देता है और एक जीन-क्लास वर्ग में समान प्रकार के सिग होते हैं। आपके पास अधिक भाग्य – sw1nn