2013-10-13 6 views
9

मैं एक जावा वर्ग है कि इस तरह दिखता है:स्कैला जावा आंतरिक कक्षा तक नहीं पहुंच सकता है?

public class Constants { 
    public class Commands { 
     public static final String CreateOrder = "CreateOrder"; 
    } 
} 

मैं का उपयोग "CreateOrder" निरंतर, जावा में मैं इसे आसानी से इस तरह का उपयोग कर सकते हैं:

String co = Constants.Commands.CreateOrder 

लेकिन स्काला इस नहीं करता है में काम क्यों नहीं ??? मैं स्कैला से "CreateOrder" तक कैसे पहुंच सकता हूं, मैं जावा कोड को बदल नहीं सकता।

धन्यवाद।

+0

क्या आप 'कंटेंट $ कमांड $ CreateOrder' को आजमा सकते हैं? –

+0

कॉन्स्टेंट $ कमांड $ CreateOrder काम नहीं किया – Mustafa

+1

'कमांड 'गैर-स्थैतिक क्यों है? –

उत्तर

5

जहाँ तक मुझे पता है, स्कैला में आप जो चाहते हैं उसे करने का कोई तरीका नहीं है।

लेकिन यदि आप पूरी तरह से जावा कोड नहीं बदल सकते हैं तो आप कुछ प्रतिबिंब चालबाजी का सहारा ले सकते हैं।

val value = classOf[Constants#Commands].getDeclaredField("CreateOrder").get(null) 
+0

मैंने इस समस्या का समाधान खोजने के लिए घंटों बिताए। मैं एक तृतीय पक्ष lib का उपयोग कर रहा हूं जिसमें इस तरह से परिभाषित स्थिरांक हैं। यह एकमात्र चीज थी जो काम करती थी। @Travis ब्राउन द्वारा नीचे दिए गए सुझाव को ऑब्जेक्ट को तत्काल करने के लिए, तब तक पहुंचने के लिए यह मेरे लिए काम नहीं करता था। –

4
Java Language Specification से

:

इनर कक्षाएं स्थिर सदस्यों की घोषणा नहीं कर सकते हैं, जब तक कि वे लगातार चर (§4.12.4), या एक संकलन समय त्रुटि तब होती है।

लगातार चर के मामले में, आप Constants.Commands.CreateOrder वाक्य रचना भले ही सामान्य रूप से Constants.Commands के लिए किसी भी संदर्भ Constants का एक उदाहरण के साथ जुड़े होने के लिए होता है, का उपयोग कर सकते तो वह एक स्थिर भीतरी वर्ग नहीं है के बाद से।

इसे जावा में एक पागल वन-ऑफ सिंटैक्टिक विशेष मामला माना जा सकता है, और यह ऐसी चीज है जिसे स्कैला भाषा डिजाइनरों ने स्कैला की जावा इंटरऑपरेबिलिटी में सेंकने के लिए परेशान नहीं किया है।

आपका सबसे अच्छा शर्त (अपने वास्तविक जावा वर्ग वास्तव में इस तरह दिखता है तो) Constants का एक उदाहरण बनाने के लिए, इसके बाद से आप एक पूरी तरह से प्राकृतिक तरीके में आंतरिक वर्ग के स्थिर क्षेत्र का उपयोग कर सकते है:

scala> (new Constants).Commands.CreateOrder 
res0: String = CreateOrder 

अगर किसी कारण से यह कोई विकल्प नहीं है, तो दुर्भाग्यवश, आपको दूसरे उत्तर में प्रतिबिंब-आधारित दृष्टिकोण के साथ जाना होगा।

3

मुझे लगता है कि प्रतिबिंब और तत्कालता का तीसरा विकल्प जावा गोंद कोड का एक छोटा टुकड़ा लिखना है। जैसा

public class Glue { 
    public static String createOrder() { return Constants.Commands.CreateOrder; } 
} 
फिर स्काला से

आप Glue.createOrder लिखने के लिए सक्षम होना चाहिए।

+0

यह मेरे प्रतिबिंब आधारित उत्तर के लिए एक अच्छा विकल्प है। यदि आप किसी एप्लिकेशन में नया जावा कोड जोड़ने/सक्षम करने में सक्षम हैं, तो यह एक बेहतर विकल्प है। – monkjack

+1

एक साइड नोट के रूप में: एसबीटी के साथ निर्माण करते समय, मिश्रण में .java फ़ाइल फेंकने से बॉक्स के बाहर काम करता है। यह अक्सर कोने के मामलों के आसपास एक त्वरित काम है जहां जावा और स्कैला दृष्टिकोण मेल नहीं खाते हैं (मुझे लगता है कि दृश्यता एक और मामला है) –

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

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