java桥_java 泛型--桥方法
因為 java 在編譯源碼時, 會進行 類型擦除, 導致泛型類型被替換限定類型(無限定類型就使用 Object). 因此為保持繼承和重載的多態特性, 編譯器會生成 橋方法.
本文最后附錄所有源碼.
Pair 是個泛型類, 它具有泛型方法 setSecond(T second),
在經過編譯時的 類型擦除 后變為 setSecond(Object second).
DateInterval 是 Pair 的實例化子類, 它具有方法 setSecond(LocalDate second).
在 Main.main 中, 我們新建 DateInterval 對象, 并用基類 Pair 來引用它,
此時調用基類的 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 {
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());
}
}
總結
以上是生活随笔為你收集整理的java桥_java 泛型--桥方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vi编辑器的工作模式及常用命令
- 下一篇: session很快失效_一口气说出 4