最近常碰到專案上,有人使用泛型的function
這邊查了網路介紹一下:
一般泛型使用
以黃彬華老師的scjp課本範例為例
price 這個屬性可能user會輸入interger、double、string等等...
class Book(T){
T price;
public void setPrice(T price) { this.price = price; } public T getPrice() { return price; }
}
class Generics{
public static void main(String[] args){
Book<Integer> book1 = new Book<Integer>();
book1.getPrice(580);
Book<String> book2 = new Book<String>();
book2.setPrice(一百二十元);
Book<double> book3 = new Book<double>();
book3.setPrice(402.5);
}
}
而課本也有搭上 [ ? ] 、 [ extends ] 或 [ super ]
1. <? extends Number>: 代表可已是Number 或是 Number的子類別
即便是 Number 是介面,能要使用[extends] 而非[implements]
2. <? super Number>: 代表可已是Number的父類別
Ex:
class Book<T>{
T price;
public static void show(Book<? extends Number> b){
System.out.println(XXXXX);
}
}
class GenericsAdv{
public static void main(String[] args){
Book<Integer> book = new Book<Integer>();
book,price = 580;
Book.show(book);
// Integer 是 Number的子類別,因為使用了<? extends> 故使用了Integer是正確的
}
}
靜態泛型使用
我以本身專案為例
/**
* URL PARAMS 轉換 JAVA Bean
* @param urlParams
* @param clazz
* @return
*/
public static <T> T URLParam2Bean (String _urlParams, Class<T> clazz) {
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
T o = (T) mapper.convertValue(JSONUtils.JSON2Map(_urlParams), clazz);
return o;
}
注一: 上網查後發現只要冠上static的泛型都會在static 後加上<T> 其餘的用法跟一般用法是一致的
注二: Class<T> 這種方式只是要表達所傳的class而已
注三: ObjectMapper() 為jacksonall裡的物件可去網址下載(http://www.java2s.com/Code/Jar/j/Downloadjacksonall190jar.htm)
本專案是用1.9.13版
<!-- jackson -->
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>1.9.13</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>