Benim düşünceme göre, Java'da hiçbir Çifti yoktur, çünkü doğrudan çifte ekstra işlevsellik eklemek istiyorsanız (örn. Karşılaştırılabilir), türleri sınırlamanız gerekir. C ++ 'da sadece umursamıyoruz ve bir çifti oluşturan türler yoksa operator <
, pair::operator <
derlenmeyecektir.
Sınırlama olmadan karşılaştırılabilir bir örnek:
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));
Tür bağımsız değişkenlerinin karşılaştırılabilir olup olmadığına ilişkin derleme zamanı denetimi ile karşılaştırılabilir bir örnek:
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));
Bu iyidir, ancak bu kez Eşleştir'de tür bağımsız değişkenleri olarak karşılaştırılamaz türleri kullanamazsınız. Bazı yardımcı sınıflarda Pair için çok sayıda Karşılaştırıcı kullanılabilir, ancak C ++ kullanıcıları bunu alamayabilir. Başka bir yol, tür argümanlarında farklı sınırlara sahip bir tür hiyerarşisinde çok sayıda sınıf yazmaktır, ancak çok fazla olası sınır ve bunların kombinasyonları vardır ...
AbstractMap.SimpleEntry
kıvrık?