2013-04-12 9 views
6

की सरणी के लिए ऑब्जेक्ट्स कास्टिंग सरणी ऑनलाइन एल्गोरिदम कक्षा के लिए होमवर्क करते समय मुझे एक समस्या आई है। कास्टिंग T[] जहां टी तुलनीय है Object[] एक रन-टाइम अपवादतुलनीय

public static <T extends Comparable<? super T>> void mergeSort(T[] xs) { 
    T[] aux = (T[]) new Object[xs.length]; 
    mergeSort(xs, aux, 0, xs.length); 
} 

को जन्म देती है मैं सी # में यह फिर से लिखने सकता है जो सामान्य सरणियों बनाने के साथ कोई समस्या नहीं है लेकिन मैं नहीं बल्कि में इस समस्या से निपटने के बारे में जानने चाहते हैं जावा।

+0

मुझे लगता है कि आप http://stackoverflow.com/questions/1817524/generic-arrays-in-java देखना चाहिए यह काफी रोचक है। –

उत्तर

12

यदि आपको रनटाइम अपवाद मिल रहा है, तो इसका मतलब है कि जिन वस्तुओं को आपने डालने का प्रयास किया है, वे उस प्रकार के पास नहीं हैं। भाषा के साथ इसके साथ कुछ लेना देना नहीं है। शायद आपके कोड में एक बग है।

संपादित करें: ऐसा लगता है जैसे आप जावा की टाइप सिस्टम कैसे काम करते हैं, इस बारे में भ्रमित हैं। सी # में, जेनेरिक वास्तव में रनटाइम पर विभिन्न प्रकार का प्रतिनिधित्व करते हैं। जावा में, जेनेरिक प्रकार रनटाइम पर मौजूद नहीं होते हैं। वे बेहतर संकलन समय प्रकार की जांच को सक्षम करने के लिए केवल एक सुविधा हैं। संकलन के दौरान, जेनेरिक को एक वास्तविक प्रकार द्वारा प्रतिस्थापित किया जाता है जिसे टाइप एरर के नाम से जाना जाता है।

आम तौर पर, सामान्य प्रकार का क्षरण Object होता है, लेकिन चूंकि आपने T के लिए ऊपरी सीमा प्रदान की है, इसलिए इसे उस बाध्य, Comparable में परिवर्तित किया गया है। इसलिए, मिटाए जाने के बाद, आपका कोड इस तरह दिखता है।

Comparable[] aux = (Comparable[]) new Object[xs.length]; 

Otherwords में, आप प्रकार Object[] की एक सरणी बना रहे हैं और तुरंत टाइप करने के लिए Comparable[] यह कास्ट करने के लिए कोशिश कर रहा। चूंकि ObjectComparable लागू नहीं करता है, इसलिए प्रकार असंगत हैं, इसलिए आपको रनटाइम अपवाद मिलता है। आप इसके बजाय Comparable एस की सरणी बनाकर इसे ठीक कर सकते हैं।

public static <T extends Comparable<? super T>> void mergeSort(T[] xs) { 
    T[] aux = (T[]) new Comparable[xs.length]; 
    mergeSort(xs, aux, 0, xs.length); 
} 
+0

स्पष्ट रूप से एक बग है और स्पष्ट रूप से जावा के जेनेरिक हैंडल के तरीके से कुछ करना है। सी # में बाध्य प्रकार पैरामीटर के सरणी बनाने में कोई समस्या नहीं है। – synapse

+0

@synapse मैंने आपके उत्तर को आपके लिए चीजों को स्पष्ट रूप से स्पष्ट करने के लिए संपादित किया है। – Antimony

2

Arrays संविधान हैं और इसका मतलब है कि वे रनटाइम पर अपने तत्वों के प्रकार को बनाए रखते हैं। जावा के जेनेरिक नहीं हैं। तो मूल रूप से वे मिश्रण नहीं करते हैं।

यह भी देखें: Generic arrays in Java

आप जेनरिक के एरे नहीं बना सकते हैं और आप उन्हें में ढाला नहीं जा सकता है। सरणीसूची का उपयोग करने के लिए बेहतर है।

3

इस प्रयास करें:

public static <T extends Comparable<? super T>> void mergeSort(T[] xs) { 
    T[] aux = (T[])java.lang.reflect.Array.newInstance(xs.getClass().getComponentType(), xs.length); 
    mergeSort(xs, aux, 0, xs.length); 
} 
+0

धन्यवाद। कोई आश्चर्य नहीं कि जावा जेनरिक एफएक्यू सौ पेज लंबा है। – synapse

+0

ऐसा करने का एक बहुत आसान तरीका है। मेरा जवाब देखें – Antimony

+0

सरल लेकिन खतरनाक। आप इस तरह के प्रकार को भी बदल सकते हैं: <टी ऑब्जेक्ट और तुलनात्मक > बढ़ाता है और यह मूल कोड के साथ भी संकलित और चलाएगा (मर्जोर्ट विधि के हस्ताक्षर पर निर्भर करता है)। लेकिन उदाहरण के लिए यदि टी हमेशा स्ट्रिंग होता है और आप स्ट्रिंग [] aux2 = (स्ट्रिंग []) ऑक्स करने का प्रयास करते हैं तो आपको अपवाद मिलेगा। आपकी तुलनात्मक सरणी में एक ही समस्या है। तो यह आसान है लेकिन यह हर समय काम नहीं कर सकता है। – jdb

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