從結果中能夠看到,咱們實現了開篇中IntegerPoint類和FloatPoint類的效果。下面來看看泛型是怎麼定義及使用的吧。
html
(1)、定義泛型:Point<T>
首先,你們能夠看到Point<T>,即在類名後面加一個尖括號,括號裏是一個大寫字母。這裏寫的是T,其實這個字母能夠是任何大寫字母,你們這裏先記着,能夠是任何大寫字母,意義是相同的。
(2)類中使用泛型
這個T表示派生自Object類的任何類,好比String,Integer,Double等等。這裏要注意的是,T必定是派生於Object類的。爲方便起見,你們能夠在這裏把T當成String,即String在類中怎麼用,那T在類中就能夠怎麼用!因此下面的:定義變量,做爲返回值,做爲參數傳入的定義就很容易理解了。
java
能夠看到,當咱們構造時使用的是String,而在setVar時,傳進去Integer類型時,就會報錯。而不是像Object實現方式同樣,在運行時纔會報強制轉換錯誤。
json
在接口上定義泛型與在類中定義泛型是同樣的,代碼以下:數組
與泛型類的定義同樣,也是在接口名後加尖括號;
(1)、使用方法一:非泛型類
可是在使用的時候,就出現問題了,咱們先看看下面這個使用方法:
app
在方法一中,咱們在類中直接把Info<T>接口給填充好了,但咱們的類,是能夠構形成泛型類的,那咱們利用泛型類來構造填充泛型接口會是怎樣呢?ide
最關鍵的是構造泛型類的過程:首先,咱們看靜態泛型函數的使用方法:
函數
轉自:http://blog.csdn.net/harvic880925/article/details/49872903oop
-
import lombok.Data;
-
-
@Data
-
public
class MultiObject<T> {
-
-
/**
-
* 成功狀態
-
*/
-
private
boolean success;
-
-
/**
-
* 異常
-
*/
-
private Exception ex;
-
-
/**
-
* 數據
-
*/
-
private T obj;
-
-
public MultiObject() {
-
}
-
-
/**
-
* 注意:當傳入的泛型是Boolean時,就和第三個構造函數衝突了。
-
*/
-
public MultiObject(boolean success) {
-
this.success = success;
-
}
-
-
public MultiObject(Exception ex) {
-
this.success =
false;
-
this.ex = ex;
-
}
-
-
public MultiObject(T value) {
-
this.success =
true;
-
this.obj = value;
-
}
-
}
泛型牛逼的地方就是在這個地方。
若是你不用泛型,而使用Object類型,那麼每次執行完以後,咱們即便獲得這個結果,還得類型轉換一下,那麼這下就像文章上面描述的那樣。分分鐘出現castfailexception。也就是類型轉換異常啦。
可是,如果使用了這個泛型以後,那麼咱們的某個操做所須要的返回結果是什麼類型,就能夠 傳入什麼類型,並且在實際取得返回結果的時候,就不須要使用類型轉換,這樣就很好的達到了目的。
這個主要是代碼設計層次的提升。寫再多的業務代碼,要是不提升,那麼寫的都是渣。
關於,這個model代碼裏面爲啥沒有getter和setter,都是由於使用@Data這個註解,能夠自動填充這個getter和setter。因此。就表在乎這個問題啦。在其餘地方能夠正常使用各個屬性getter和setter方法,雖然這些方法,你暫時看不見。有興趣的能夠了解下lombok。
this
恰巧我都使用過,就正好記錄一下實際使用實例。spa
-
/**
-
* 將Json字符串信息轉換成對應的Java對象
-
*
-
* @param json json字符串對象
-
* @param c 對應的類型
-
*/
-
public
static <T>
T parseJsonToObj(String json, Class<T> c) {
-
try {
-
JSONObject jsonObject = JSONObject.parseObject(json);
-
return JSON.toJavaObject(jsonObject, c);
-
}
catch (Exception e) {
-
LOG.error(e.getMessage());
-
}
-
return
null;
-
}
而後是具體調用的地方的代碼。
能夠看到,真的只是由於傳入的參數類型不同,但若你不知道泛型的話,那你就得沒遇到一個類型的轉換,你就得寫一個這麼個方法。
Collector collectorObj = JSONUtils.parseJsonToObj(collector, Collector.class); Flume flume = JSONUtils.parseJsonToObj(flumeJson, Flume.class); Probe probe = JSONUtils.parseJsonToObj(probeJson, Probe.class);
-
/**
-
* @param dest 目的集合
-
* @param source 源集合
-
* @param <T> 集合參數的類型
-
*/
-
private
static <T>
void listAddAllAvoidNPE(List<T> dest, List<T> source) {
-
if (source ==
null) {
-
return;
-
}
-
dest.addAll(source);
-
}
-
-
private
static <T>
void listAddAvoidNull(List<T> dest, T source) {
-
if (source ==
null) {
-
return;
-
}
-
dest.add(source);
-
}
這個時候,這個T,使用起來就像使用咱們經常使用的通常對象同樣,我這的參數是個List類型,固然也但是其餘類型的,姿式都同樣。
而後是具體調用的地方的代碼
這個方法的第二個參數的返回值多是null,因此,直接調用addAll(),就會拋空指針異常。因此,就如上,那麼一提取。就好多啦。
List<ProbeObject> list = Lists.newArrayList(); listAddAllAvoidNPE(list, decoder.getProperties());