本次功能的實現場景:讀取Yaml配置文件,然后將其中的信息轉換成指定的對象。
在這里定義了一個Yaml的工具類,希望工具類的返回對象類型可以根據調用方法時傳入的對象類型來定義。
通過泛型實現
工具類:
public class YamlUtil {
public <T> T readNodeFromYml(Class<T> type) throws YamlException, FileNotFoundException{
File dumpFile = new File(System.getProperty("user.dir") + "/src/main/conf/searchNode.yml");
YamlReader reader = new YamlReader(new FileReader(dumpFile));
return reader.read(type);
}
}
調用工具類
public static void main(String[] args) throws Exception {
YamlUtil util=new YamlUtil();
//讀取yaml文件
SearchNode searchNode = util.readNodeFromYml(SearchNode.class);
TestStrategy strategy = searchNode.getTestStrategy();
int num=strategy.add(2, 3);
System.out.println(num);
}
通過<T> 聲明告訴JVM返回值定義一個泛型 T
這里的T只是個占位符的效果,26個字母隨便寫哪個字母都可以,但一定要是和< >里面相同的字母,這里使用T。
工具類傳入的參數也是T類型的,通過Class<T> type
定義一個T類型的參數,最終此方法的作用就成了:傳入一個指定類型的對象,然后讀取Yaml配置文件后再返回一個此類型的對象。
使用泛型和使用Object有何不同
在Java SE 1.5之前,沒有泛型的情況的下,通過對類型Object的引用來實現參數的“任意化”,“任意化”帶來的缺點是要做顯式的強制類型轉換,而這種轉換是要求開發者對實際參數類型可以預知的情況下進行的。對於強制類型轉換錯誤的情況,編譯器可能不提示錯誤,在運行的時候才出現異常,這是一個安全隱患。
泛型的好處是在編譯的時候檢查類型安全,並且所有的強制轉換都是自動和隱式的,提高代碼的重用率。
由此可見,使用泛型,有2個好處:
不需要做強制類型轉換
編譯時更安全。