亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java 和等于() 方法中的泛型類:類型安全

Java 和等于() 方法中的泛型類:類型安全

qq_花開花謝_0 2022-09-22 15:54:47
我想重寫泛型類中的 equals() 方法,為此,我必須將 Object 轉換為我的泛型類型 Pair。我添加了@SuppressWarnings(“未選中”)來“靜音”警告,但問題仍然存在。方法也不適用于泛型類型,因此使用 T.getType() 是不可能的。public class Pair<T, U> {    private T first;    private U second;    public Pair(T _first, U _second)    {        first = _first;        second = _second;    }    public boolean equals(Object obj) {         if (this == obj)           return true;         if (obj == null)           return false;         if (getClass() != obj.getClass())           return false;        //Problem ahead!!!         Pair<T, U> other = (Pair<T, U>) obj;                   ...    }}是否有任何普遍的良好做法或“技巧”可以正確,安全地做到這一點?
查看完整描述

5 回答

?
慕容森

TA貢獻1853條經驗 獲得超18個贊

您可以投射到 a 并調用 和 :objPair<?, ?>equalsfirstsecond


Pair<?, ?> other = (Pair<?, ?>) obj;

return other.first.equals(first) && other.first.equals(second);

這樣,類型檢查將由 和 處理,無論和是什么。T.equalsU.equalsTU


查看完整回答
反對 回復 2022-09-22
?
交互式愛情

TA貢獻1712條經驗 獲得超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;

介于 之間有點像通配符,它實際上被歸類為無界通配符;這意味著尚未指定類的類型。?<>


將檢查兩件事,首先它將檢查對象是否不為空,因此為您創建安全性,然后它將檢查該對象是否為類型。object instanceof Pair<?, ?>nullPair<?, ?>


您可以在此處閱讀有關通配符的信息


根據,如果您要覆蓋,也不要忘記覆蓋。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;

}

為什么當我覆蓋等于時,我必須覆蓋哈希碼?


您必須覆蓋每個類中覆蓋等于 () 的哈希碼 ()。如果不這樣做,將導致違反 Object.hashCode() 的總協定,這將阻止您的類與所有基于哈希的集合(包括哈希映射、哈希集和哈希表)一起正常運行。


查看完整回答
反對 回復 2022-09-22
?
喵喔喔

TA貢獻1735條經驗 獲得超5個贊

您可以使用 來檢查對象的類型,然后安全地投射它。instanceof

if(obj instanceof Pair){
   Pair other = (Pair) obj;
}


查看完整回答
反對 回復 2022-09-22
?
慕的地6264312

TA貢獻1817條經驗 獲得超6個贊

由于泛型類型在編譯時被擦除,因此無法在運行時中檢查該類型。所以你應該把它扔到.Pair<?,?>


如果使用 JDK 7 或更高版本,則還可以在方法中使用。這將簡化代碼,因為您不必擔心是否為 。Objects.equals(..)equalsfirstsecondnull


Pair<?, ?> pair = (Pair<?, ?>) obj;

return Objects.equals(first, pair.first) &&

  Objects.equals(second, pair.second);

另外,如果在類中添加了方法,請不要忘記實現。hashCodeequals


@Override

public int hashCode() {

  return Objects.hash(first, second);

}


查看完整回答
反對 回復 2022-09-22
?
互換的青春

TA貢獻1797條經驗 獲得超6個贊

首先請記住,泛型僅在編譯時處于活動狀態。它們是編譯時檢查的額外層,以確保您不會濫用可以采用不同類型的容器或函數。

還要記住,自Java第一個版本以來,它一直存在,而泛型是在Java 1.5中引入的。因此,對于這種特定方法,您將有一些類型轉換要做,這是很自然的。equals()

轉換對象后,您無論如何都會檢查 的每個元素,因此,如果它們屬于不同的類型,它們也將無法進行相等性檢查。Pair


查看完整回答
反對 回復 2022-09-22
  • 5 回答
  • 0 關注
  • 131 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號