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; } }
