2010-04-13 4 views
9

उदा। नीचे दिया गया कोड क्लासकास्ट अपवाद को फेंकता है जब दूसरा ऑब्जेक्ट ट्रीसेट में जोड़ा जाता है। क्या TreeSet लिखा नहीं जा सका ताकि टाइप पैरामीटर केवल एक तुलनात्मक प्रकार हो? i.e. ट्रीसेट संकलित नहीं होगा क्योंकि ऑब्जेक्ट तुलनात्मक नहीं है। इस तरह जेनेरिक वास्तव में अपना काम करते हैं - टाइपएफ़ होने के नाते।जावा के ट्रीसेट क्यों निर्दिष्ट नहीं करते हैं कि इसके प्रकार पैरामीटर को तुलनात्मक रूप से विस्तारित किया जाना चाहिए?

import java.util.TreeSet; 
public class TreeSetTest { 
    public static void main(String [] args) { 
    TreeSet<Object> t = new TreeSet<Object>(); 
    t.add(new Object()); 
    t.add(new Object()); 
    } 
} 

उत्तर

4

यदि प्रकार को तुलनात्मक होना आवश्यक है, तो आप एक गैर-तुलनीय प्रकार और एक तुलनाकर्ता (जिसे आप अभी कर सकते हैं) के साथ ट्रीसेट नहीं बना सकते।

टाइप-सुरक्षित होने के दौरान इसे ठीक करने का एक तरीका दो वर्गों के लिए होता है: एक तुलनीय प्रकार पैरामीटर वाला और एक गैर तुलनीय प्रकार पैरामीटर वाला और कोई डिफ़ॉल्ट कन्स्ट्रक्टर नहीं (केवल कन्स्ट्रक्टर जो एक तुलनाकर्ता लेता है), लेकिन मुझे लगता है कि जावा देव दो वर्गों को शुरू नहीं करना चाहते थे जो मूल रूप से एक ही काम करते थे (हालांकि किसी को आसानी से दूसरे के चारों ओर एक रैपर के रूप में लागू किया जा सकता था)।

एक और (और तर्कसंगत क्लीनर तरीका) प्रकार प्रणाली का विस्तार करना होगा ताकि कुछ रचनाकार केवल कुछ प्रकार के पैरामीटर के साथ उपयोग किए जाने पर मौजूद हों (यानी डिफ़ॉल्ट नियंत्रक केवल तभी मौजूद होता है जब प्रकार पैरामीटर तुलनीय है), लेकिन मुझे लगता है कि जावा के लिए जेनेरिक सिस्टम बहुत जटिल बना दिया है।

+0

व्यापक उत्तर के लिए धन्यवाद। लॉल, मुझे लगता है कि जेनेरिक सिस्टम पहले से ही जटिल है! – Tarski

13

TreeSetComparable होने के लिए अपने प्रकार पैरामीटर की आवश्यकता नहीं है, क्योंकि यह गैर Comparable मानों की तुलना के लिए एक बाहरी Comparator ले सकते हैं।

+0

आह धन्यवाद। मुझे लगता है कि नो-Args कन्स्ट्रक्टर पर प्रतिबंध निर्दिष्ट करने का कोई तरीका नहीं है ताकि यह केवल तुलनात्मक हो सके? क्या यह दो वर्गों के लिए एक बेहतर डिज़ाइन होगा - एक जो एक तुलनात्मक प्रकार पैरामीटर लेता है और कोई भी जो किसी भी प्रकार का पैरामीटर लेता है लेकिन यह रचनाकारों को तुलनात्मक लेना चाहिए? – Tarski

+4

@ टार्स्की: 'ट्रीसेट' को 1.2 में जोड़ा गया था। जेनेरिक 1.5 में जोड़ा गया था। –

1

ऐसा इसलिए है क्योंकि मान आवश्यक रूप से Comparable को लागू करना होगा। आप सेट को Comparator ऑब्जेक्ट को स्पष्ट रूप से पास कर सकते हैं, इस स्थिति में तत्व प्रकार को Comparable होने की आवश्यकता नहीं है।

0

आप TreeSet को Comparator के साथ कन्स्ट्रक्टर पैरामीटर के रूप में भी बना सकते हैं। तब आपके सामान तुलनीय नहीं होना चाहिए।

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

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