Class T泛型和通配符泛型的區別


平時看java源代碼的時候,如果碰到泛型的話,我想? T K V E這些是經常出現的,但是有時想不起來代表什么意思,今天整理下: 

? 表示不確定的java類型。
T 表示java類型。
K V 分別代表java鍵值中的Key Value。
E 代表Element。

Object跟這些東西代表的java類型有啥區別呢?
Object是所有類的根類,是具體的一個類,使用的時候可能是需要類型強制轉換的,但是用T ?等這些的話,在實際用之前類型就已經確定了,不需要強制轉換。
追問:
也就是說,這個方法能知道返回的是哪種類型(父類),就用T行了?如果完全不知道的就用?用T的得到的對象就不需要類型轉換了,而用?的就必需用強轉了!
追答:
第一種是固定的一種泛型,第二種是只要是Object類的子類都可以,換言之,任何類都可以,因為Object是所有類的根基類
固定的泛型指類型是固定的,比如:Interge,String. 就是<T extends Collection>

<? extends Collection> 這里?代表一個未知的類型,
但是,這個未知的類型實際上是Collection的一個子類,Collection是這個通配符的上限.
舉個例子
class Test <T extends Collection> { }

<T extends Collection>其中,限定了構造此類實例的時候T是一個確定類型(具體類型),這個類型實現了Collection接口,
但是實現 Collection接口的類很多很多,如果針對每一種都要寫出具體的子類類型,那也太麻煩了,干脆還不如用
Object通用一下。
<? extends Collection>其中,?是一個未知類型,是一個通配符泛型,這個類型是實現Collection接口即可。

_________________________上面講的是什么鬼,當你知道引入通配符泛型的由來之后(下面代碼由java1234.com提供)

 

The method take(Animal) in the type Test is not applicable for the arguments (Demo<Dog>)
The method take(Animal) in the type Test is not applicable for the arguments (Demo<Cat>)
The method take(Animal) in the type Test is not applicable for the arguments (Demo<Animal>)
 
          
 
          
當引入泛型之后,遇到這種情況,參數怎么寫都不適合,總有2個方法不適用,為了給泛型類寫一個通用的方法,這時候就需要引入了 ?通配符的概念。

 
          
 
          
public class Demo <T extends Animal>{

    private T ob;

    public T getOb() {
        return ob;
    }

    public void setOb(T ob) {
        this.ob = ob;
    }

    public Demo(T ob) {
        super();
        this.ob = ob;
    }
    
    public void print(){
        System.out.println("T的類型是:"+ob.getClass().getName());
    }
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM