2010-10-14 15 views
7

मैं सी # की दुनिया से आ रहा हूं।जावा सी # गतिशील वर्ग प्रकार के बराबर है?

सी # में

मैं वर्ग गतिशील http://msdn.microsoft.com/en-us/library/dd264741.aspx

यह मैं टेम्प्लेटेड/सामान्य कक्षाओं का उपयोग लेकिन certian स्थितियों के लिए एक simliar महसूस प्राप्त करने के लिए नहीं की अनुमति देता है का उपयोग करने में सक्षम हूँ।

मैं कर रहा हूँ इंटरनेट खोजों में unsuccessfull किया गया है के रूप में दुर्भाग्य से 'गतिशील' और 'जावा' कीवर्ड गतिशील आर्किटेक्चर पर असंबंधित जानकारी को की बहुत बढ़ाएं।

मैं JavaFX में थोड़ा शिकायत मिली हो और वहाँ एक प्रकार वर ग # के गतिशील के रूप में ही उपयोग के लिए प्रकट होता है। हालांकि यह जावा में उपयोग करने योग्य प्रतीत नहीं होता है।

धन्यवाद, स्टेफ़नी

+2

मुझे उत्सुकता है कि आप इसे सी # में कैसे उपयोग कर रहे हैं। ऐसा लगता है कि आप स्थिर प्रकार की सुरक्षा से बचने के लिए इसका उपयोग कर रहे हैं, जो सी # ** या ** जावा में एक अच्छा विचार नहीं है। –

उत्तर

12

जावा गतिशील टाइपिंग का समर्थन नहीं करता है, लेकिन आप जावा में है कि का उपयोग कर गतिशील प्रॉक्सी की तरह कुछ अनुकरण कर सकते हैं।

MyOps p = (MyOps) Proxy.newProxyInstance(getClass().getClassLoader(), // 
    new Class<?>[] { MyOps.class }, // 
    new MyHandler(myObject)); 
p.foo(); 
p.boo(); 

जहां MyHandler इस तरह घोषित किया जाता है:

public interface MyOps { 
    void foo(); 
    void boo(); 
} 

फिर myObjectInstance पर गतिशील मंगलाचरण के लिए प्रॉक्सी बनाने के लिए: सबसे पहले आप आपरेशनों आप अपने वस्तुओं पर आह्वान करना चाहते हैं के साथ एक इंटरफेस घोषित करने के लिए की आवश्यकता होगी

public class MyHandler implements InvocationHandler { 
    private final Object o; 

    public MyHandler(Object o) { 
    this.o = o; 
    } 

    public Object invoke(Object proxy, Method m, Object[] args) throws Throwable { 
    Method method = o.getClass().getMethod(m.getName(), m.getParameterTypes()); 
    return method.invoke(o, args); 
    } 
} 

इसलिए, अगर myObject में विधियों foo() और बू() हैं, तो उन्हें बुलाया जाएगा, अन्यथा, आपको RuntimeException मिलेगा।

वहाँ भी है जिन भाषाओं में JVM में चला सकते हैं की संख्या गतिशील टाइपिंग का समर्थन करता है, उदा स्कैला, ग्रोवी, जेआरबी, बीनशेल, जावास्क्रिप्ट/राइनो और कई अन्य। देशी गतिशील प्रेषण का समर्थन करने के लिए जावा 7 में कुछ जेवीएम परिवर्तन आ रहे हैं, इसलिए ये भाषाएं बेहतर प्रदर्शन कर सकती हैं, लेकिन ऐसी सुविधा सीधे टाइप की गई जावा भाषा में प्रकट नहीं होगी।

3

कि जावा

में की तरह कुछ भी नहीं है
3

वहाँ जावा में बराबर कुछ भी नहीं है। सबसे नज़दीकी चीज जो आप कर सकते हैं वह ऑब्जेक्ट प्रकार का एक चर घोषित करता है, लेकिन फिर उस ऑब्जेक्ट को उस ऑब्जेक्ट पर डालने के लिए जो भी आप उम्मीद कर रहे हैं उसे ऑब्जेक्ट द्वारा लागू नहीं किया गया है (या प्रतिबिंब का उपयोग करें लेकिन यह स्लूओओ) है।

जावा एक दृढ़ता से टाइप की गई भाषा है। मुझे लगता है कि अगले संस्करण के लिए बंद करने की अनुमति देने के लिए कुछ गतिशील टाइपिंग होगी, लेकिन यह अगले वर्ष या उससे अधिक 2012 है।

ग्रोवी में आप एक प्रकार के बिना एक चर घोषित करने के लिए "def" का उपयोग कर सकते हैं, और प्रकार रनटाइम पर हल किया जाएगा। और अगर आप जावा बाईटकोड को ग्रूवी कोड संकलन कर सकते हैं ...

+2

डायनामिक टाइपिंग के साथ बंद करने के लिए क्या करना है? –

+0

शायद कुछ नहीं ... मुझे लगता है कि यह कार्यान्वयन पर निर्भर करता है।ग्रोवी को संदर्भ के रूप में उपयोग करके, आप "डीफ माईवर" के साथ कुछ घोषित कर सकते हैं और इसे कुछ भी निर्दिष्ट कर सकते हैं (बंद करने सहित)। मुझे लगता है कि आपके पास जावा में क्लोजर प्रकार हो सकता है, लेकिन यदि गतिशील टाइपिंग भी हो तो यह अधिक लचीला नहीं होगा? – Chochos

+0

@Chochos मुझे पता है कि यह 3 साल देर हो चुकी है - लेकिन सी # में लागू किए गए बंद होने के लिए गतिशील टाइपिंग नहीं थी - यह प्रकार अनुमान था। –

0

आप स्कैला कोड भी शामिल कर सकते हैं, जिसमें स्पष्ट प्रकार की घोषणाओं की आवश्यकता नहीं है। स्कैला जावा बाइट कोड उत्पन्न करता है। मैंने सी # का उपयोग नहीं किया है, इसलिए मुझे डर है कि मैं इस टिप्पणी को सीधे प्रश्न के जवाब देने के बिंदु पर नहीं ले सकता। शायद कोई और इसमें जोड़ सकता है।

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