Theo tôi, không có Cặp nào trong Java bởi vì, nếu bạn muốn thêm chức năng bổ sung trực tiếp vào cặp (ví dụ: Có thể so sánh), bạn phải ràng buộc các loại. Trong C ++, chúng tôi không quan tâm và nếu các kiểu soạn một cặp không có operator <
, thì pair::operator <
nó cũng sẽ không được biên dịch.
Một ví dụ về So sánh không có giới hạn:
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));
Một ví dụ về So sánh với kiểm tra thời gian biên dịch để xem các đối số loại có thể so sánh được không:
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));
Điều này là tốt, nhưng lần này bạn không thể sử dụng các loại không thể so sánh làm đối số loại trong Cặp. Người ta có thể sử dụng nhiều Bộ so sánh cho Cặp trong một số lớp tiện ích, nhưng người C ++ có thể không nhận được. Một cách khác là viết nhiều lớp trong một hệ thống phân cấp kiểu với các giới hạn khác nhau trên các đối số kiểu, nhưng có quá nhiều giới hạn có thể và sự kết hợp của chúng ...
AbstractMap.SimpleEntry
phức tạp?