JAVA中泛型的up-case 和 down-case

今天在SUN網站上看關於泛型的資料,覺得它舉的一個例子很好,一下讓我解決了泛型的類型轉換這個難題。
http://java.sun.com/docs/books/tutorial/java/generics/wildcards.html

情境
通過籠子裝動物來解釋泛型的up-case and down-case。
二個類:籠子(泛型)與動物
class 籠子 <T> { }
class  動物 { }
class 獅子 extends 動物 { }
class 蝴蝶 extends 動物 { }

對象:獅子、蝴蝶和若干不同類型的籠子
一隻獅子 = new 獅子()
一隻蝴蝶 =  new 蝴蝶 ()
一隻裝獅子的籠子 = new 籠子<獅子>()
    這隻籠子很牢固,但不密集。
一隻裝蝴蝶的籠子 = new 籠子<蝴蝶>()
    這隻亂子很密集,但不牢固。
一只可以裝所有動物的籠子 = new 籠子<動物>()
    這個籠子不但牢固,而且密集。
一只可以裝某種動物的籠子 = new 籠子 <? extends 動物> ()
    這個籠子長得什麼個樣子,沒人知道。它可能很牢固,可能很密集,也可能兩者都有。

問題
1.
一隻裝獅子的籠子 .add(一隻獅子)
一隻裝蝴蝶的籠子.add(一隻蝴蝶)
2.
一只可以裝所有動物的籠子.add(一隻獅子)
一只可以裝所有動物的籠子.add(一隻蝴蝶)
3.
一只可以裝所有動物的籠子 = 一隻裝獅子的籠子 (is a)
一只可以裝所有動物的籠子 = 一隻裝蝴蝶的籠子 (is a)
4.
一只可以裝某種動物的籠子.add(一隻獅子)
一只可以裝某種動物的籠子.add(一隻蝴蝶)
5.
一只可以裝某種動物的籠子 = 一隻裝獅子的籠子 (is a)
一只可以裝某種動物的籠子 = 一隻裝蝴蝶的籠子 (is a)
 

解答
1。 顯然成立。
2。顯然成立。
3。都成立。
      因爲
               (一隻裝獅子的籠子:很牢固,但不密集。
                          而    一只可以裝所有動物的籠子:不但牢固,而且密集。)
       所以
               一隻裝獅子的籠子 is not a 可以裝所有動物的籠子
       證明完畢
       另一語句證明類似
4。一只可以裝某種動物的籠子 能裝一個獅子或者一隻蝴蝶嗎?那請問你究竟是用來裝什麼動物先。如果你決定要裝獅子,因爲這隻籠子只能裝某一種,那對不起,你不能再裝蝴蝶。反之亦然。竟然不知道能裝什麼,那就什麼也不能裝了。所以這兩個語句都錯誤。
5。都成立。
      因爲
               (一隻裝獅子的籠子:很牢固,但不密集。
                          而    一只可以裝所有動物的籠子:可能很牢固,可能很密集,也可能兩者都有。)
       所以
               一隻裝獅子的籠子 是一種  可以裝某種動物的籠子
       證明完畢
       另一語句證明類似。

補充
對於問題4,如果一只可以裝某種動物的籠子什麼都裝不了,那它不就是廢物了嗎?不然,它可以應用於泛型函數中。
如:
void 喂籠中動物 (一只可以裝某種動物的籠子) {
從 這只可以裝某種動物的籠子 中取出 動物 並進行餵養
}
調用:
喂籠中動物 (一隻裝獅子的籠子)
喂籠中動物 (一隻裝蝴蝶的籠子)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章