मेरी राय में, जावा में कोई जोड़ी नहीं है क्योंकि, यदि आप सीधे जोड़ी पर अतिरिक्त कार्यक्षमता जोड़ना चाहते हैं (जैसे तुलनीय), तो आपको प्रकारों को बाध्य करना होगा। C ++ में, हम सिर्फ परवाह नहीं करते हैं, और यदि एक जोड़ी की रचना के प्रकार नहीं हैं operator <
, तो pair::operator <
संकलन भी नहीं होगा।
कोई सीमा नहीं के साथ तुलना का एक उदाहरण:
public class Pair<F, S> implements Comparable<Pair<? extends F, ? extends S>> {
public final F first;
public final S second;
/* ... */
public int compareTo(Pair<? extends F, ? extends S> that) {
int cf = compare(first, that.first);
return cf == 0 ? compare(second, that.second) : cf;
}
//Why null is decided to be less than everything?
private static int compare(Object l, Object r) {
if (l == null) {
return r == null ? 0 : -1;
} else {
return r == null ? 1 : ((Comparable) (l)).compareTo(r);
}
}
}
/* ... */
Pair<Thread, HashMap<String, Integer>> a = /* ... */;
Pair<Thread, HashMap<String, Integer>> b = /* ... */;
//Runtime error here instead of compile error!
System.out.println(a.compareTo(b));
इस प्रकार के तर्कों की तुलना के लिए संकलन-समय की जाँच के साथ तुलना का एक उदाहरण:
public class Pair<
F extends Comparable<? super F>,
S extends Comparable<? super S>
> implements Comparable<Pair<? extends F, ? extends S>> {
public final F first;
public final S second;
/* ... */
public int compareTo(Pair<? extends F, ? extends S> that) {
int cf = compare(first, that.first);
return cf == 0 ? compare(second, that.second) : cf;
}
//Why null is decided to be less than everything?
private static <
T extends Comparable<? super T>
> int compare(T l, T r) {
if (l == null) {
return r == null ? 0 : -1;
} else {
return r == null ? 1 : l.compareTo(r);
}
}
}
/* ... */
//Will not compile because Thread is not Comparable<? super Thread>
Pair<Thread, HashMap<String, Integer>> a = /* ... */;
Pair<Thread, HashMap<String, Integer>> b = /* ... */;
System.out.println(a.compareTo(b));
यह अच्छा है, लेकिन इस बार आप जोड़ी में तर्क के रूप में गैर-तुलनीय प्रकार का उपयोग नहीं कर सकते हैं। कुछ उपयोगिता वर्ग में जोड़ी के लिए बहुत सारे कम्पेसाटर का उपयोग कर सकते हैं, लेकिन C ++ लोग इसे प्राप्त नहीं कर सकते हैं। एक और तरीका यह है कि टाइप आर्ग्युमेंट पर अलग-अलग सीमा के साथ एक प्रकार की पदानुक्रम में बहुत सारी कक्षाएं लिखी जाएं, लेकिन बहुत सारे संभावित सीमाएं और उनके संयोजन हैं ...
AbstractMap.SimpleEntry
सजाया जाता है?