第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

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

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

qq_花開花謝_0 2022-09-22 15:54:47
我想重寫泛型類中的 equals() 方法,為此,我必須將 Object 轉(zhuǎn)換為我的泛型類型 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;                   ...    }}是否有任何普遍的良好做法或“技巧”可以正確,安全地做到這一點(diǎn)?
查看完整描述

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


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

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)行。


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

TA貢獻(xiàn)1735條經(jīng)驗(yàn) 獲得超5個贊

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

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


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

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);

}


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

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超6個贊

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

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

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


查看完整回答
反對 回復(fù) 2022-09-22
  • 5 回答
  • 0 關(guān)注
  • 143 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號