package cn.xf.cp.ch02.item27; import java.util.HashSet; import java.util.Set; public class Union { /** * 這個方法就會有警告 * @param s1 * @param s2 * @return */ public static Set union1(Set s1, Set s2) { Set result = new HashSet(s1); result.addAll(s2); return result; } /** * 這裡使用泛型就是安全沒有警告的 * @param s1 * @param s2 * @return */ public static <E> Set<E> union(Set<E> s1, Set<E> s2) { Set<E> result = new HashSet<E>(s1); result.addAll(s2); return result; } }
但是有的時候,我們發現使用泛型的時候,在調用構造器的時候要明確泛型的類型,這樣書寫很麻煩
這裡可以使用一個泛型靜態方法,利用泛型的類型推導
package cn.xf.cp.ch02.item27; import java.util.HashMap; import java.util.List; import java.util.Map; public class GenericStaticFactory { public static <K, V> HashMap<K, V> newHashMap() { return new HashMap<K, V>(); } public static void main(String[] args) { //這裡創建對象的時候,就會根據前面map中的String和List<String>自動轉換 Map<String, List<String>> anagrams = newHashMap(); } }
關於泛型單利工廠的實現
package cn.xf.cp.ch02.item27; public class GenericSingletonFactory { //先創建object對象,暫時替代T對象 private static UnaryFunction<Object> IDENTITY_FUNCTION = new UnaryFunction<Object>() { public Object apply(Object arg) { return arg; } }; //根據T,吧IDENTITY_FUNCTION轉換為相應的類型,由於IDENTITY_FUNCTION返回未被修改的object類型參數,所以下面類型轉換時安全的 @SuppressWarnings("unchecked") public static <T> UnaryFunction<T> identityFunction() { return (UnaryFunction<T>) IDENTITY_FUNCTION; } public static void main(String[] args) { String[] strings = { "jute", "hemp", "nylon" }; UnaryFunction<String> sameString = identityFunction(); for (String s : strings) System.out.println(sameString.apply(s)); Number[] numbers = { 1, 2.0, 3L }; UnaryFunction<Number> sameNumber = identityFunction(); //這裡用來判斷是否真的實現了單例 Object t1 = sameString; Object t2 = sameNumber; if(t1 == t2) { System.out.println("相同引用"); } String s1 = "123456"; String s2 = new String("123456"); if(s1.equals(s2)) System.out.println("相同內容"); for (Number n : numbers) System.out.println(sameNumber.apply(n)); } }
顯示結果: