java中關於 的一些了解


<T>和<?>的區別

  <T>是參數類型,常常用於泛型類或泛型方法的定義;<?>是通配符,一般不能直接用來定義類或泛型方法,因為它不能直接參與操作,常常用於泛型方法的調用代碼或泛型方法的型參。

  <T>在List、Set、Map中經常見到,用來限制Class中的參數類型,確保Class中參數的一致性。例如:List<String> list = new ArrayList<>();創建了一個內部參數是String類型的類,list中的操作對象都是String。<?>代表任意java類型,只有在不關心數據的具體類型下才使用通配符表示,但在一些情況下,需要將<?>傳入的數據進行強轉,但這樣不如直接傳入<T>。

public class Test1 {

    public <T> void test1(List<T> list){
        System.out.println("== test1 output ==");
        System.out.println("list length: " + list.size());  //
        if (!list.isEmpty()) {
            T t = list.get(0); //list中的元素為T類型
            System.out.println("t = " + t);//
        }
    }

    public void test2(List<?> list){
        System.out.println("== test2 output ==");
        System.out.println("list length: " + list.size());//
        if (!list.isEmpty()) {
            Object o = list.get(0);//list中的元素為Object
            System.out.println("o = " + o);//
        }
    }
}

   另外除了<?>,還有<? extends T>上界通配符和<? super T>下界通配符。<? extends T> 表示傳入數據值需要是T類型或T的子類,<? suprt T>表示傳入數據值需要是T類型或T的超類。詳細例子見java泛型知識--博客園

一般來說,<?>主要用於變量上,<T>主要用於類或方法上。下圖中,list的元素類型為?,但往里邊添加String時,會顯示出錯,因為list中的類型是一個未知的java類型,不屬於任何類,所以往里邊添加數據時會出錯。但可以從list中取出數據,取出的數據類型為Object。

 

其他講解資料:

java泛型中<?>和<T>有什么區別?

stack overflow

知乎

 


免責聲明!

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



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