Java Type Inference (類型推斷)


public class Test2 {

    public static void main(String[] args) {
        ArrayList<String> list = newArrayList();
        list.add("k");
        list.add("b");
        System.out.println(list.getClass());

        // 這一句編譯是不會通過的,因為編譯器對pick()返回值的推斷是Serializable或Comparable類型
        // 亦即 String "a", list 這兩個參數共同繼承的接口類型
        // List<String> b = pick("a", list);
        // System.out.println(b);

        // 同樣,這里需要聲明的變量類型是參數 ("", 1) 共有的父類型即 Serializable或者 Comparable
        Serializable s = pick("", 1);
        System.out.println(s.getClass());

        // 當兩個參數類型相同時,則可以正確推斷出返回值類型
        String s2 = pick("a", "b");
        System.out.println(s2.getClass());

        // 假如你使用的方法是pick2(E, T)則可以更具參數精確推斷出返回值類型
        String s3 = pick2(1.5, "abc");
        System.out.println(s3.getClass());

        // Java 1.6 暫時不支持菱形操作符
        // List<String> list2 = new ArrayList<>();
    }

    static <T> ArrayList<T> newArrayList() {
        return new ArrayList<T>();
    }

    /**
     * a, b 同類型的推斷
     *
     * @param a
     * @param b
     * @param <T>
     * @return
     */
    static <T> T pick(T a, T b) {
        return b;
    }

    /**
     * a, b不同類型時的精確推斷
     *
     * @param a
     * @param b
     * @param <T>
     * @param <E>
     * @return
     */
    static <T, E> E pick2(T a, E b) {
        return b;
    }
}

 


免責聲明!

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



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