问下这两个java的泛型方法的写法不一样, 但效果一样, 使用场景有何不同
怪我咯
怪我咯 2017-04-18 10:48:45
0
4
566

定义

    public static void printList(List<?> list) {
        for (Object elem : list){
            System.out.println(elem + " ");
        }
    }

    public static <T> void printList2(List<T> list) {
        for (T elem : list){
            System.out.println(elem + " ");
        }
    }

使用

        MyList.printList(Arrays.asList(1, 2, 3));

        MyList.printList2(Arrays.asList(1, 2, 3));
怪我咯
怪我咯

走同样的路,发现不同的人生

全部回覆(4)
Peter_Zhu

>是可以任意寫,不受限制,

則要求出現T的地方都是相同的泛型

伊谢尔伦

這個效果是一樣的,並非要求出現T的地方都是相同的類型。實際上上面兩個方法編譯成字節碼,List,List>在底層都是List

但第二種用法在實際的開發中起不到任何作用。為什麼呢,除非泛型是聲明回傳值的類型,或是聲明在類別層次的。比如說

private static <T> T fun1(List<T> list) {
}

或者是

public interface Main<T> {
    public void fun(T t);
}
//然后

public class MainImpl<String> {
    @override
    public void fun(String str) {
    }
}

這才起到了作用。

否則,像這樣用 public static <T> void fun1(List<T> list)
這裡的泛型起到了什麼作用?真沒看出來起了什麼作用。應該說,沒必要這樣用吧。

Ty80

?和T都表示不確定的類型,但是使用T的話可以進行物件的操作,例如 return t; 這種時候就用T不用?了。

黄舟

List<?>List<T> 的超类,能使用 List<?> 的地方都可以使用 List<T>

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!