日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java桥_java 泛型--桥方法

發(fā)布時間:2023/12/10 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java桥_java 泛型--桥方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

因為 java 在編譯源碼時, 會進行 類型擦除, 導致泛型類型被替換限定類型(無限定類型就使用 Object). 因此為保持繼承和重載的多態(tài)特性, 編譯器會生成 橋方法.

本文最后附錄所有源碼.

Pair 是個泛型類, 它具有泛型方法 setSecond(T second),

在經(jīng)過編譯時的 類型擦除 后變?yōu)?setSecond(Object second).

DateInterval 是 Pair 的實例化子類, 它具有方法 setSecond(LocalDate second).

在 Main.main 中, 我們新建 DateInterval 對象, 并用基類 Pair 來引用它,

此時調(diào)用基類的 setSecond 方法時, 我們希望它能夠?qū)崿F(xiàn)多態(tài), 即調(diào)用 DateInterval.setSecond(LocalDate) 方法.

事實上, java 編譯器通過插入 橋方法 的方式, 幫助我們實現(xiàn)了該功能.

反編譯 DateInterval.class 會發(fā)現(xiàn)它具有兩個 setSecond 方法:

void setSecond(LocalDate);

void setSecond(Object).

并且, 在 void setSecond(Object) 中會調(diào)用 void setSecond(LocalDate), 這就是所謂的橋方法.

附: DateInterval.class 反編譯后的代碼:

Compiled from "DateInterval.java"

public class com.book.chapter8.DateInterval extends com.book.chapter8.Pair {

public com.book.chapter8.DateInterval();

Code:

0: aload_0

1: invokespecial #1 // Method com/book/chapter8/Pair."":()V

4: return

public void setSecond(java.time.LocalDate);

Code:

0: aload_1

1: aload_0

2: invokevirtual #2 // Method getFirst:()Ljava/lang/Object;

5: checkcast #3 // class java/time/chrono/ChronoLocalDate

8: invokevirtual #4 // Method java/time/LocalDate.compareTo:(Ljava/time/chrono/ChronoLocalDate;)I

11: iflt 19

14: aload_0

15: aload_1

16: invokespecial #5 // Method com/book/chapter8/Pair.setSecond:(Ljava/lang/Object;)V

19: return

public void setSecond(java.lang.Object);

Code:

0: aload_0

1: aload_1

2: checkcast #6 // class java/time/LocalDate

5: invokevirtual #7 // Method setSecond:(Ljava/time/LocalDate;)V

8: return

}

附: 其他所有源碼:

Pair.java:

package com.book.chapter8;

/**

* Created by zhixiao.mzx on 2016/11/5.

*/

public class Pair {

private T first;

private T second;

public Pair() {

first = null;

second = null;

}

public Pair(T first, T second) {

this.first = first;

this.second = second;

}

public T getFirst() {

return first;

}

public void setFirst(T first) {

this.first = first;

}

public T getSecond() {

return second;

}

public void setSecond(T second) {

this.second = second;

}

}

DateInterval.java:

package com.book.chapter8;

import java.time.LocalDate;

/**

* Created by zhixiao.mzx on 2016/11/5.

*/

public class DateInterval extends Pair {

public void setSecond(LocalDate second) {

if (second.compareTo(getFirst()) >= 0) {

super.setSecond(second);

}

}

}

Main.java:

package com.book.chapter8;

import java.time.LocalDate;

/**

* Created by zhixiao.mzx on 2016/11/5.

*/

public class Main {

public static void main(String[] args) {

DateInterval interval = new DateInterval();

Pair pair = interval;

pair.setFirst(LocalDate.now());

pair.setSecond(LocalDate.now());

}

}

總結(jié)

以上是生活随笔為你收集整理的java桥_java 泛型--桥方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。