2011-11-07 18 views
29

मैं बहुत उलझन में हूँ पर कास्ट नहीं कर सकते हैं ...कार्यान्वित इंटरफ़ेस

मैं एक वर्ग जो सीधे एक अंतरफलक को लागू करता है:

public class Device implements AutocompleteResult 
{...} 

यहाँ सबूत है कि मैं सही पर देख रहा हूँ चर:

Object match = ...; 
log.debug(match.getClass()); // Outputs 'Device' 
log.debug(match.getClass().getInterfaces()[0]); // Outputs 'AutocompleteResult' 

फिर भी जब मैं इंटरफ़ेस के वर्ग का एक उदाहरण कास्ट करने के लिए प्रयास करें:

AutocompleteResult result = (AutocompleteResult) match; 

मुझे क्लासकास्ट अपवाद मिलता है!

ClassCastException: Device cannot be cast to AutocompleteResult 
इसके अलावा

, isAssignableFrom रिटर्न झूठी और मुझे यकीन है कि क्यों नहीं कर रहा हूँ:

log.debug(AutocompleteResult.class.isAssignableFrom(Device.class)); 
doc से

:

निर्धारित करता है कि वर्ग या इंटरफ़ेस इस वर्ग का प्रतिनिधित्व करती ऑब्जेक्ट या तो एक सुपरक्लास या superinterf जैसा है निर्दिष्ट वर्ग पैरामीटर द्वारा प्रतिनिधित्व कक्षा या इंटरफेस का ऐस।

क्या मैं हमेशा किसी ऑब्जेक्ट को अपने वर्ग के कार्यान्वयन में ऑब्जेक्ट नहीं डालना चाहता हूं?

धन्यवाद।

+0

हाँ, आप चाहिए! (और आपको स्पष्ट कलाकारों की भी आवश्यकता नहीं है।) कृपया कुछ स्वयं निहित उदाहरण कोड पोस्ट करें जो समस्या का प्रदर्शन करता है। –

उत्तर

54

यह तब हो सकता है जब दो अलग-अलग क्लासलोडर AutocompleteResult नामक कक्षा लोड करते हैं।

इन दो वर्गों को तब पूरी तरह अलग कक्षाओं के रूप में माना जाता है, भले ही उनके पास एक ही पैकेज और नाम (और यहां तक ​​कि कार्यान्वयन/फ़ील्ड/विधियां) हों।

इसके लिए एक आम कारण यह है कि यदि आप किसी प्रकार की प्लगइन प्रणाली का उपयोग करते हैं और आपके बेस क्लास और प्लगइन कक्षाएं एक ही कक्षा में प्रदान करते हैं।

इस समस्या के लिए जाँच करने के लिए मूल्य दोनों हमलावर वर्गों पर Class.getClassLoader() द्वारा दिया प्रिंट (अर्थात DeviceऔरAutocompleteResult.class का परिणाम द्वारा कार्यान्वित इंटरफ़ेस का वर्ग)।

+1

वाह, धन्यवाद! मैं सचमुच इस पर बालों को फाड़ रहा था। मैं अब क्लासलोडिंग समस्या को हल करने का प्रयास करूंगा ... – pstanton

+3

+1: 'log.debug (match.getClass()। getInterfaces() [0] .getClassLoader()) आज़माएं; log.debug (AutocompleteResult.class.getClassLoader()) ' –

+0

मेरा मुद्दा यह था कि मेरे पास गलत आयातित वर्ग था और इससे मुझे यह निर्धारित करने में मदद मिली: 'कक्षा [] इंटरफेस = match.getClass()। getInterfaces(); getInterfaces(); के लिए (int i = 0; i toobsco42

0

AKA जब जावा स्पष्ट रूप से जावा नहीं करता है।

मैं प्ले फ्रेमवर्क 2.6.3 के साथ हाल ही में इस समस्या को मारा, क्या मदद मिली मुझे इस था: https://www.playframework.com/documentation/2.6.x/ThreadPools#Application-class-loader

मैं लोगों कि एक ही समस्या हो सकता है के लिए यहां यह जानकारी छोड़ दें।

यह स्पष्ट करने के लिए, क्या मदद करता है:

एक उत्सुक सिंगलटन पर आवेदन इंजेक्शन और फिर वर्गों मैं के साथ मुद्दों कर रहा था लोड करने के लिए अपने classloader का उपयोग कर।

यह स्पष्ट

public class Module { 


@Override 
public void configure { 
    bind(TheClassLoaderLoader.class).asEagerSingleton() 

public static class TheClassLoaderLoader { 
    @Inject 
     public TheClassLoaderLoader(Application application) { 

     ClassLoader classloader = application.classloader(); 

       Class<?> interfaceClass = classloader.loadClass(InterfaceClass.class.getName()); 
       classloader.loadClass(ImplementsInterfaceClass.class.getName()).asSubclass(interfaceClass); 

यहाँ https://playframework.com/documentation/2.6.x/JavaDependencyInjection#Configurable-bindings

उदाहरण Environment का उपयोग करता है कि बनाने के लिए अक्सर फेंकता एक निराशा होती ClassNotFoundException

चीयर्स

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