泛型無界萬用字元<?>的思考

liusyuan1996發表於2024-06-04

起因:無界萬用字元<?>作為引數可以接受任意型別引數,入參的具體型別在呼叫方法時並不需要確定,聯想到泛型方法中引數的型別是在呼叫方法時被定義,實踐探究二者異同。

public class Generic01 {
    public static void main(String[] args) {
        ArrayList<String> arrayList = new ArrayList<String>();
        arrayList.add("test1");
        arrayList.add("test2");
        TestGeneric aa = new TestGeneric();
        aa.getClass1(arrayList);

        aa.getClass2(arrayList);
    }
}
class TestGeneric{
    public<T> void getClass1(List<T> t){
        for (T t1 : t) {
            System.out.println(t1.getClass());
        }
    }
    public void getClass2(List<?> t){
        for (Object o : t) {
            System.out.println(o.getClass());
        }
    }
}

結論:public void aaa(List t) 方法是一個具有型別引數 T 的泛型方法,可以在方法內部具體地操作指定型別 T 的列表元素。而 public void bbb(List t) 方法使用了無界萬用字元 ,表示可以接受任意型別的列表引數,但方法內部無法確定具體的型別,只能將列表元素視為 Object 型別處理。因此,在方法內部對列表元素的操作受到一定限制。

相關文章