程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 【Effective Java】7、優先考慮泛型方法,effectivejava

【Effective Java】7、優先考慮泛型方法,effectivejava

編輯:JAVA綜合教程

【Effective Java】7、優先考慮泛型方法,effectivejava


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

 

 

顯示結果:

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved