2012-01-15 8 views
6

मैं कक्षा A युक्त एक सरल जार फ़ाइल है:स्काला - गतिशील वर्ग लोड हो रहा है - वर्ग एक वर्ग में ढाला नहीं जा सकता है एक

public class A {} 

तो मैं यह क्रम में लोड:

var classLoader = new URLClassLoader(Array(my_jar_file.toURI.toURL)) 
var clazz = classLoader.loadClass("A") 

यह ठीक है, यह वर्ग A लोड कर सकता है। यह आदेश भी ठीक है:

clazz.newInstance 

लेकिन जब मैंने उसे A लिए डाली:

java.lang.ClassCastException: A cannot be cast to A 

आप कृपया मेरी मदद कर सके:

clazz.newInstance.asInstanceOf[A] 

मैं यह त्रुटि मिल गया?

+1

आप कोड के साथ पूरा करने की कोशिश कर रहे हैं जोInstanceOf [ए] के रूप में उपयोग करता है। –

उत्तर

5

आपका कोड तात्पर्य है कि आपके पास "ए" एक क्लासलोडर संदर्भ में उपलब्ध है जहां आप clazz.newInstance.asInstanceOf [ए] को कॉल कर रहे हैं, जहां से आप क्लाज़ ऑब्जेक्ट प्राप्त कर रहे हैं से एक अलग संदर्भ है। समस्या यह है कि आपके पास दो अलग-अलग वर्ग लोडर संदर्भों में कक्षा "ए" के दो अलग-अलग उदाहरण हैं। कक्षा "ए" के एक संस्करण से बनाई गई एक वस्तु को किसी अन्य क्लासलोडर संदर्भ में दूसरे संस्करण के उदाहरण में नहीं डाला जा सकता है।

+0

धन्यवाद। लेकिन अगर मैं जावा में ऐसा करता हूं, तो यह ठीक है। क्या आप कृपया मेरे कोड को ठीक कर सकते हैं ताकि मैं कक्षा लोड कर सकूं और इसका इस्तेमाल कर सकूं? –

+0

मुझे खेद है। असल में जावा में मेरे पास एक इंटरफ़ेस 'I' है। 'ए'' I' से लागू किया गया है। जब मैं जार से 'ए' लोड करता हूं, तो मैं जांचता हूं कि यह 'I' का उदाहरण है, फिर 'I' पर कास्ट करें और उपयोग करें। यह ठीक है। –

+0

@HiBlack - स्कैला में, जावा विधि इंटरफ़ेस तक सीधे कोई विधि कार्यान्वयन या vals/vars संकलन के साथ विशेषता नहीं है। हो सकता है कि आप अपना "ए" कुछ विशेषता "मैं" बढ़ा सकें, और फिर अपनी कास्ट बना सकते हैं? – Rogach

4

मुझे एक बहुत ही समान समस्या का अनुभव हुआ, जिसमें मैंने ClassCastException देखा जब गतिशील रूप से लोड ऑब्जेक्ट को इसके द्वारा कार्यान्वित इंटरफ़ेस में कास्टिंग किया गया।
नील के जवाब के लिए धन्यवाद, मैं यह निर्धारित करने में सक्षम था कि ClassCastException विभिन्न वर्ग लोडर संदर्भों के कारण हुआ था।

इसे ठीक करने के लिए मैंने URLClassLoader(URL[] urls) कन्स्ट्रक्टर के बजाय URLClassLoader(URL[] urls, ClassLoader parent) कन्स्ट्रक्टर का उपयोग किया।

+0

Thx, यह वास्तव में मेरी समस्या का समाधान। –

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