Java之泛型 T與T的用法


<T> T表示返回值是一個泛型,傳遞啥,就返回啥類型的數據,而單獨的T就是表示限制你傳遞的參數類型,這個案例中,通過一個泛型的返回方式,獲取每一個集合中的第一個數據, 通過返回值<T> T 和T的兩種方法實現

<T> T 用法

這個<T> T 表示的是返回值T是泛型,T是一個占位符,用來告訴編譯器,這個東西先給我留着,等我編譯的時候,告訴你。

package com.yellowcong.test;

import java.util.ArrayList;
import java.util.List;

import org.apache.poi.ss.formula.functions.T;

public class Demo {

    public static void main(String[] args) {

        Demo demo = new Demo();

        //獲取string類型
        List<String> array = new ArrayList<String>();
        array.add("test");
        array.add("doub");
        String str = demo.getListFisrt(array);
        System.out.println(str);

        //獲取nums類型
        List<Integer> nums = new ArrayList<Integer>();
        nums.add(12);
        nums.add(13);

        Integer num = demo.getListFisrt(nums);
        System.out.println(num);
    }

    /**
     * 這個<T> T 可以傳入任何類型的List
     * 參數T
     *     第一個 表示是泛型
     *     第二個 表示返回的是T類型的數據
     *     第三個 限制參數類型為T
     * @param data
     * @return
     */
    private <T> T getListFisrt(List<T> data) {
        if (data == null || data.size() == 0) {
            return null;
        }
        return data.get(0);
    }

}

 

T 用法

返回值,直接寫T表示限制參數的類型,這種方法一般多用於共同操作一個類對象,然后獲取里面的集合信息啥的。

package com.yellowcong.test;

import java.util.ArrayList;
import java.util.List;

public class Demo2<T> {

    public static void main(String[] args) {

        //限制T 為String 類型
        Demo2<String> demo = new Demo2<String>();

        //獲取string類型
        List<String> array = new ArrayList<String>();
        array.add("test");
        array.add("doub");
        String str = demo.getListFisrt(array);
        System.out.println(str);

        //獲取Integer類型 T 為Integer類型
        Demo2<Integer> demo2 = new Demo2<Integer>();
        List<Integer> nums = new ArrayList<Integer>();
        nums.add(12);
        nums.add(13);
        Integer num = demo2.getListFisrt(nums);
        System.out.println(num);
    }

    /**
     * 這個只能傳遞T類型的數據
     * 返回值 就是Demo<T> 實例化傳遞的對象類型
     * @param data
     * @return
     */
    private T getListFisrt(List<T> data) {
        if (data == null || data.size() == 0) {
            return null;
        }
        return data.get(0);
    }
}
 
 
 
 

Java中的Object、T(泛型)、?區別

 

因為最近重新看了泛型,又看了些反射,導致我對Object、T(以下代指泛型)、?產生了疑惑。

我們先來試着理解一下Object類,學習Java的應該都知道Object是所有類的父類,注意:那么這就意味着它的范圍非常廣!首先記住這點,如果你的參數類型時Object,那么的參數類型將非常廣!

《Thinking in Java》中說很多原因促成了泛型的出現,最引人注目的一個原因就是為了創造容器類。這個要怎么來理解呢?我的理解是,可以拋開這個為了創造容器類這個,而是回到泛型的目的是限定某種類型上來。

所以我們現在能小結一下Object和T很重要的兩點區別就是:

  1. Object范圍非常廣,而T從一開始就會限定這個類型(包括它可以限定類型為Object)。
  2. Object由於它是所有類的父類,所以會強制類型轉換,而T從一開始在編碼時(注意是在寫代碼時)就限定了某種具體類型,所以它不用強制類型轉換。(之所以要強調在寫代碼時是因為泛型在虛擬機中會被JVM擦除掉它的具體類型信息,這點可參考泛型,在這里不做引申)。

比如在jdk中的List類是個泛型類。現在我們制定它的類型是Object。

        List<Object> list = new ArrayList<Object>();
        int i = 0;
        String s = "s";
        list.add(i);
        list.add(s);

List本身是個泛型類,現在我們指定它接收Object類型的參數,此時就可以放置任意類型的參數進去,而在取出來是就必須得進行強制類型轉換成具體的類型。

現在我們如果將List指定接收String類型的參數,那么這個List就只能放置String類型,且取出來時就不用進行強制類型轉換。

這點給我們帶來的啟示是,在編寫類似List類的時候,一定要注意是否用泛型。一定要多寫幾個泛型類,多討論多理解,不然還是可能會攪在一起。


 接着是?,這個可能在用到反射需要獲取Class類型時用到,它的解釋就是:接收一個不確定的類型,有點和Object一樣。我對它一個理解是,如果只用"?"那么它和Object是一樣的,但是"?"有比Object稍微“高級”有點的用法,就是它能縮小一個不確定的范圍,利用類似"? extends Test",這就意味着只接收接收Test類的繼承類,是不是比Object的范圍縮小了?

以上就是Object、T、?的區別。多寫幾行代碼,多做試驗,多討論,就知道在何時何地恰當的使用了。


免責聲明!

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



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