5 回答

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超18個贊
您可以投射到 a 并調(diào)用 和 :objPair<?, ?>equalsfirstsecond
Pair<?, ?> other = (Pair<?, ?>) obj;
return other.first.equals(first) && other.first.equals(second);
這樣,類型檢查將由 和 處理,無論和是什么。T.equalsU.equalsTU

TA貢獻(xiàn)1712條經(jīng)驗(yàn) 獲得超3個贊
你可以這樣寫你的方法:equals
@Override
public boolean equals(Object object) {
boolean equal = false;
if(this == object){
equal = true;
} else if(object instanceof Pair<?, ?>) {
// Check that object is an instance of Pair<?, ?>, this will also null check.
// Then just case object to Pair<?, ?> like.
Pair<?, ?> pair = (Pair<?, ?>) object;
if(((this.first == null && pair.first == null) || (this.first != null && this.first.equals(pair.first))) &&
((this.second == null && pair.second == null) || (this.second != null && this.second.equals(pair.second)))){
equal = true;
}
}
return equal;
介于 之間有點(diǎn)像通配符,它實(shí)際上被歸類為無界通配符;這意味著尚未指定類的類型。?<>
將檢查兩件事,首先它將檢查對象是否不為空,因此為您創(chuàng)建安全性,然后它將檢查該對象是否為類型。object instanceof Pair<?, ?>nullPair<?, ?>
您可以在此處閱讀有關(guān)通配符的信息
根據(jù),如果您要覆蓋,也不要忘記覆蓋。ntalbsequalshashCode
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashcode;
result = result * prime + (this.first == null ? 0 : this.first.hashCode());
result = result * prime + (this.second == null ? 0 : this.second.hashCode());
return result;
}
為什么當(dāng)我覆蓋等于時,我必須覆蓋哈希碼?
您必須覆蓋每個類中覆蓋等于 () 的哈希碼 ()。如果不這樣做,將導(dǎo)致違反 Object.hashCode() 的總協(xié)定,這將阻止您的類與所有基于哈希的集合(包括哈希映射、哈希集和哈希表)一起正常運(yùn)行。

TA貢獻(xiàn)1735條經(jīng)驗(yàn) 獲得超5個贊
您可以使用 來檢查對象的類型,然后安全地投射它。instanceof
if(obj instanceof Pair){ Pair other = (Pair) obj; }

TA貢獻(xiàn)1817條經(jīng)驗(yàn) 獲得超6個贊
由于泛型類型在編譯時被擦除,因此無法在運(yùn)行時中檢查該類型。所以你應(yīng)該把它扔到.Pair<?,?>
如果使用 JDK 7 或更高版本,則還可以在方法中使用。這將簡化代碼,因?yàn)槟槐負(fù)?dān)心是否為 。Objects.equals(..)equalsfirstsecondnull
Pair<?, ?> pair = (Pair<?, ?>) obj;
return Objects.equals(first, pair.first) &&
Objects.equals(second, pair.second);
另外,如果在類中添加了方法,請不要忘記實(shí)現(xiàn)。hashCodeequals
@Override
public int hashCode() {
return Objects.hash(first, second);
}

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超6個贊
首先請記住,泛型僅在編譯時處于活動狀態(tài)。它們是編譯時檢查的額外層,以確保您不會濫用可以采用不同類型的容器或函數(shù)。
還要記住,自Java第一個版本以來,它一直存在,而泛型是在Java 1.5中引入的。因此,對于這種特定方法,您將有一些類型轉(zhuǎn)換要做,這是很自然的。equals()
轉(zhuǎn)換對象后,您無論如何都會檢查 的每個元素,因此,如果它們屬于不同的類型,它們也將無法進(jìn)行相等性檢查。Pair
添加回答
舉報