哈嘍大家好,我是阿Q!
事情是這個樣子的......

對話中的截圖如下:

看了阿Q的解釋,你是否也和“馬小跳”一樣存在疑問呢?請往??看
我們都知道在java中,只要是型別兼容,就可以將一種型別的物件分配給另一種型別的物件,比如可以將一個Integer型別的物件分配給Object型別的物件,因為Object 是Integer的超類,
Object someObject = new Object();
Integer someInteger = new Integer(10);
someObject = someInteger; //OK
在面向物件中,我們把它稱之為 is a 的關系,因為Integer是Object的一種子類,所以允許被賦值,
又因為Integer也是Number的一種子類,所以下邊的代碼也是有效的:
public void someMethod(Number n) { /* ... */ }
someMethod(new Integer(10)); // OK
someMethod(new Double(10.1)); // OK
當然泛型也是如此,在執行泛型型別呼叫時,將Number作為其型別引數傳遞,如果引數是Number的子型別,則允許任何后續的add呼叫:
Box<Number> box = new Box<Number>();
box.add(new Integer(10)); // OK
box.add(new Double(10.1)); // OK
現在我們來看以下代碼:
public void boxTest(Box<Number> n) { /* ... */ }
該方法接收什么型別的引數呢?
通過該方法,大家肯定知道它的引數型別為Box<Number>,但是大家思考一個問題:你認為Box<Integer> 和Box<Double>型別的引數可以傳入嗎?
答案是否定的,

盡管Integer是Number的子型別,但Box<Integer> 和Box<Double>不是Box<Number>的子類,它倆的父類物件是Object,文首的對話表達的就是這個意思,
那么問題來了,當類的泛型相關時,如何在兩個泛型類之間創建類似子型別的關系呢?例如如何讓Box<Integer> 和Box<Double>變得與Box<Number>有關呢?
為了搞懂這個問題,我們先來了解一下同一型別的物件是如何實作子型別化的吧,

通過分析原始碼我們可以發現:ArrayList<E> 實作了 List<E>,List<E> 繼承了Collection<E>,所以ArrayList<String>是List<String>的子型別, List<String>是 Collection<String>的子型別,因此當我們在傳遞引數時,ArrayList<String>型別的是可以給List<E>或者Collection<E>傳遞的,
只要不改變型別引數,型別之間的子型別關系就會保留,
如果我們想要定義我們自己的串列介面PayloadList,使得泛型型別P的可選值與每個元素相關聯,可以定義如下:
interface PayloadList<E,P> extends List<E> {
void setPayload(int index, P val);
...
}

則PayloadList<String,String>、PayloadList<String,Integer>、PayloadList<String,Exception>都是List<String>的子型別,
小結:可以通過繼承泛型類或者實作介面來對其進行子型別化,
搞懂了子型別化的問題,我們回到“如何在兩個泛型類之間創建類似子型別的關系“的問題,
泛型類或者介面并不會僅僅因為它們的型別之間有關系而變得相關,如果要達到相關,我們可以使用通配符來創建泛型類或介面之間的關系,

Box<Integer> 和Box<Number>的父類物件其實是Box<?>
為了在這些類之間創建關系,以便代碼可以通過Box<Integer>訪問Box<Number>的方法,可以使用上限通配符:
Box<? extends Integer> initBox = new Box<>();
Box<? extends Number> numberBox = initBox;
// OK. Box<? extends Integer> is a subtype of Box<? extends Number>
因為Integer是Number的子型別,numberBox的泛型是Number物件子類,所以在intBox和numberBox之間存在關系,

圖為用上限和下限通配符宣告的幾個類之間的關系,
所以,“馬小跳”的問題你會了嗎?還不會的話來技術群交流吧!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/412865.html
標籤:Java
下一篇:不卷了!技術團隊成員集體辭職
