Java泛型是JDK 5中引入的一個新特性,允許在定義類和介面的時候使用型別參數。 泛型類
泛型類是我們最經常使用的泛型形式了,如下:
/** * 工具類 * Created by yuedong.li on 12/8/15. */public class ToolsUtil<T> { /** * if-else替代 * @param condition 條件 * @param t1 對象1 * @param t2 對象2 * @return 結果 */ public T ifThenElse(boolean condition, T t1, T t2) { if (condition) { return t1; } return t2; }}
一個工具類,當前用來代替if-else
使用方法也很簡單
public class Main { public static void main(String[] args) { double res = new ToolsUtil<Double>().ifThenElse(1 > 2, 1.0, 2.0); System.out.println(res); }}
泛型方法
隨著需求越來越多,工具類 ToolsUtil 可能需要增加很多的工具類,但是並非其他的方法的參數傳回值等都是 T ,我們需要進行粒度調整,這時候就是泛型方法表現的時候了。
/** * 工具類 * Created by yuedong.li on 12/8/15. */public class ToolsUtil { /** * if-else替代 * @param condition 條件 * @param t1 對象1 * @param t2 對象2 * @param <T> 類型 * @return 結果 */ public <T> T ifThenElse(boolean condition, T t1, T t2) { if (condition) { return t1; } return t2; } /** * 檢查Email * * @param email * email * @return 是否是合法郵件 */ public static boolean checkEmail(String email) { boolean result = false; //some code about checking email string return result; }}
上面的代碼我們使用泛型方法將 ifThenElse 函數的獨立出來了,不再必須在建立 ToolsUtil 類時必須指定了。
使用方法依舊相對容易:
public class Main { public static void main(String[] args) { double res = new ToolsUtil().ifThenElse(1 > 2, 1.0, 2.0); System.out.println(res); boolean checkRes = new ToolsUtil().checkEmail("app@codeboy.me"); System.out.println(checkRes); }}
可以看出建立 ToolsUtil 的時候不需要再指定類型了,代碼看起來清爽了很多。
我們經常將工具類的方法寫成靜態下,當然泛型方法也是可以的:
/** * 工具類 * Created by yuedong.li on 12/8/15. */public class ToolsUtil { /** * 檢查Email * * @param email * email * @return 是否是合法郵件 */ public static boolean checkEmail(String email) { boolean result = false; //some code about checking email string return result; } /** * if-else替代 * @param condition 條件 * @param t1 對象1 * @param t2 對象2 * @param <T> 類型 * @return 結果 */ public static <T> T ifThenElse(boolean condition, T t1, T t2) { if (condition) { return t1; } return t2; }}
使用更加的簡潔,操作如下:
public class Main { public static void main(String[] args) { double res = ToolsUtil.ifThenElse(1 > 2, 1.0, 2.0); System.out.println(res); boolean checkRes = ToolsUtil.checkEmail("app@codeboy.me"); System.out.println(checkRes); }}
需要注意的一點是 <T> 必須在 修飾詞 (public private static final等)和傳回值之間 總結
泛型方法在什麼時候使用呢。 ①類型約束只是在局部
泛型的作用於不是針對全域,而僅僅是針對局部的時候,如 ToolsUtil 類 ②靜態方法需要處理泛型
如上面例子中的ifThenElse,普通的靜態方法是不能使用泛型的。 更多文章請訪問小胖軒