यह बजाय क्योंकि अगर ई तुलनीय है हो सकता है, ई के बच्चों के माता पिता ई के नहीं हो सकता है, जबकि तुलनीय होना चाहिए।
Comparator
Comparable
ऑब्जेक्ट्स पर भरोसा नहीं करता है।
इसे अक्सर वैकल्पिक या पूरक के रूप में भी उपयोग किया जाता है।
वास्तव में, इस निर्माता
public TreeSet(Comparator<? super E> comparator) {...}
हो सकता था:
public TreeSet(Comparator<E> comparator) {... }
लेकिन एक कम घिरे वाइल्डकार्ड निर्दिष्ट करके, JDK डेवलपर्स Comparator
की इजाजत दी जा करने के लिए द्वारा ग्राहक वर्गों के लिए और अधिक लचीलापन प्रदान की वर्तमान कक्षा के उदाहरणों और अभिभावक वर्ग के उदाहरणों के साथ अंतःक्रियाशील। कुछ मामलों में, यह समझ में आता है।
अब इस:
public TreeSet(Comparator<? extend E> comparator) {
के रूप में यह मतलब है कि आप एक compare()
विधि पैरामीटर के रूप में उपवर्ग प्रकार निर्दिष्ट के साथ समाप्त कर सकते हैं मान्य नहीं हो सकता है।
लेकिन Set
के तत्वों में एक विशिष्ट उपclass के उदाहरण हो सकते हैं लेकिन न केवल।
इस कोड की कल्पना कीजिए:
TreeSet<CharSequence> set = new TreeSet<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
...
}
});
set.add("string");
set.add(new StringBuilder());
...
मैं String
रों तुलना चाहते हैं, लेकिन Set
String
उदाहरणों को रख सकती है लेकिन यह भी की CharSequence
ऐसे StringBuilder
, CharBuffer
, आदि ...
के रूप में और अगर CharSequence
था किसी भी उपवर्ग abstract
नहीं, इसमें उनके उदाहरण भी शामिल हो सकते हैं।
इस उदाहरण के साथ, हम समझते हैं कि अवधारणा Comparator<? extend E>
गलत है।