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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

java 泛型--桥方法

發布時間:2024/1/17 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 泛型--桥方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

本文最后附錄所有源碼.

Pair 是個泛型類, 它具有泛型方法 setSecond(T second),
在經過編譯時的 類型擦除 后變為 setSecond(Object second).

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

在 Main.main 中, 我們新建 DateInterval 對象, 并用基類 Pair<LocalDate> 來引用它,
此時調用基類的 setSecond 方法時, 我們希望它能夠實現多態, 即調用 DateInterval.setSecond(LocalDate) 方法.
事實上, java 編譯器通過插入 橋方法 的方式, 幫助我們實現了該功能.

反編譯 DateInterval.class 會發現它具有兩個 setSecond 方法:

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

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

    Compiled from "DateInterval.java" public class com.book.chapter8.DateInterval extends com.book.chapter8.Pair<java.time.LocalDate> {public com.book.chapter8.DateInterval();Code:0: aload_01: invokespecial #1 // Method com/book/chapter8/Pair."<init>":()V4: returnpublic void setSecond(java.time.LocalDate);Code:0: aload_11: aload_02: invokevirtual #2 // Method getFirst:()Ljava/lang/Object;5: checkcast #3 // class java/time/chrono/ChronoLocalDate8: invokevirtual #4 // Method java/time/LocalDate.compareTo:(Ljava/time/chrono/ChronoLocalDate;)I11: iflt 1914: aload_015: aload_116: invokespecial #5 // Method com/book/chapter8/Pair.setSecond:(Ljava/lang/Object;)V19: returnpublic void setSecond(java.lang.Object);Code:0: aload_01: aload_12: checkcast #6 // class java/time/LocalDate5: invokevirtual #7 // Method setSecond:(Ljava/time/LocalDate;)V8: return }

    附: 其他所有源碼:

    Pair.java:

    package com.book.chapter8;/*** Created by zhixiao.mzx on 2016/11/5.*/ public class Pair<T> {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<LocalDate> {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<LocalDate> pair = interval;pair.setFirst(LocalDate.now());pair.setSecond(LocalDate.now());} }

    轉載于:https://www.cnblogs.com/xiaozhang9/p/6033955.html

    總結

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

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。