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

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

泛型的擦除如何“替換”多個邊界

泛型的擦除如何“替換”多個邊界

楊__羊羊 2023-12-13 15:06:37
我讀到,在類型擦除過程中,Java 編譯器會擦除所有類型參數(shù),如果類型參數(shù)有界,則用其第一個界限替換每個參數(shù),如果類型參數(shù)無界,則用 Object 替換。但是,我無法理解,指定類型參數(shù)需要實現(xiàn)的接口不是多余的嗎?例如:public class Box<T extends Something,Seralizable,Cloneable>如果擦除將T類內(nèi)部替換Box為Something(類引用),是不是意味著接口:Seralizable,Cloneable必須由 Something 類實現(xiàn),所以只有我覺得指定Seralizable,Cloneable接口是多余的?此外,如果菱形內(nèi)僅提及接口,默認情況下是否將其T視為Object參考,會發(fā)生什么情況?我很高興能提供一個泛型類的示例和一個泛型方法的示例(如果泛型方法中存在多個擴展)。
查看完整描述

1 回答

?
函數(shù)式編程

TA貢獻1807條經(jīng)驗 獲得超9個贊

您實際上已經(jīng)回答了您的問題:如果類型不受限制,則擦除是第一個邊界或?qū)ο蟆W屛覀兛磶讉€例子:


public class A implements Serializable {

    //  since the first bound is Cloneable, the erasure is Cloneable

    static <T extends Cloneable & Serializable> void doSomething1(T t) {}


    //  since the first bound is Serializable, the erasure is Serializable

    static <T extends Serializable & Cloneable> void doSomething2(T t) {}


    // since T is not bounded, the erasure is Object

    static <T> void doSomething(T t) {

        System.out.println("A");

    }


    // the type of A is a class, so it has to come first

    // the erasure is A since it comes first

    static <T extends A & Serializable> void doSomething(T t) {

        System.out.println("B");

    }


    // not possible because the bounds are two classes

    // static <T extends Object & A> void doSomething(T t) {return null;}

}

由于擦除不同,方法可以具有相同的名稱!但這是完全不推薦的,而且相當令人困惑,因為行為發(fā)生了變化:


public static void main(String[] args) {

    A.doSomething(new Object());  // prints "A"

    A.doSomething(new A());       // prints "B"

}

編輯后回答您的問題:不,這并不多余。指定類型參數(shù)需要實現(xiàn)的類型使您可以訪問邊界的方法。讓我們看一下下面的例子:


public final class Box<T extends A & Comparable<T>> {

    private T item1;

    private T item2;


    int compare() {

        // this is the compare method of Comparable interface

        return item1.compareTo(item2);

    }

}

從上面的示例中您可以看到它A沒有實現(xiàn)該Comparable接口。這意味著,如果您只是編寫,則無法簡單地比較使用該方法Box<T extends A>中的兩項,因為沒有實現(xiàn)。如果您希望框項屬于類并實現(xiàn)接口,則需要指定兩個邊界。BoxcompareToAComparableA Comparable


A實現(xiàn)的不是參考Comparable,而是T參考!即使刪除了T extends A & Comparable<T>will,A編譯器仍然可以在較低級別上執(zhí)行轉(zhuǎn)換。這就是這里正在發(fā)生的事情。如果您使用使用checkcastjavap指令的實用程序檢查字節(jié)碼,您可以看到這一點:


  int compare();

         ....

         0: aload_0

         1: getfield      #7                  // Field item1:LA;

         4: checkcast     #13                 // class java/lang/Comparable

         7: aload_0

         8: getfield      #15                 // Field item2:LA;

        11: invokeinterface #18,  2           // InterfaceMethod java/lang/Comparable.compareTo:(Ljava/lang/Object;)I

        16: ireturn

        ....


查看完整回答
反對 回復(fù) 2023-12-13
  • 1 回答
  • 0 關(guān)注
  • 155 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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