首頁  >  問答  >  主體

问下这两个java的泛型方法的写法不一样, 但效果一样, 使用场景有何不同

定义

    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));
怪我咯怪我咯2744 天前572

全部回覆(4)我來回復

  • 天蓬老师

    天蓬老师2017-04-18 10:50:45

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

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

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 10:50:45

    這個效果是一樣的,並非要求出現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)
    這裡的泛型起到了什麼作用?真沒看出來起了什麼作用。應該說,沒必要這樣用吧。

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-18 10:50:45

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

    回覆
    0
  • 黄舟

    黄舟2017-04-18 10:50:45

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

    回覆
    0
  • 取消回覆