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(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 泛型--桥方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Cesium原理篇:6 Render模块
- 下一篇: react native初始化项目