2017-04-06 227 views
0

我想創建一個方法,它可以接受一個對象類型作爲參數,然後我可以使用它來實例化另一個對象。通用類型作爲方法參數

例如,傳遞String類型的方法,該方法體內,做

List<String> l = new ArrayList<String>(); 
String s = new String("abc"); 

我如何去這樣做呢?

編輯:

How to have Java method return generic list of any type?沒有回答我的問題的第一部分。

作爲一個後續,我可以在方法體內創建一個傳入類型的實例,就像上面代碼片段中的第二行一樣嗎?

+0

有很多關於Java中的泛型的教程......你是否至少嘗試過其中一個教程? – Tom

+0

我已經閱讀了幾篇幫助我實現利用泛型的代碼的教程。不幸的是,我無法解決這個問題。如果可能,鏈接將受到高度讚賞。 – user1889776

+0

那麼,如果你學習泛型,你必須學會​​的第一件事就是你不能用通用類型調用'new',因爲泛型類型在運行時不存在。 – RealSkeptic

回答

1

沒有任何機制爲了得到那只是泛型。你必須使用反射來獲得。

public <T> T instantiator(Class<T> c){ 
    if (c != null){ 
     try { 
      return (T) c.getConstructor().newInstance(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
    return null; 
} 

但是,如果沒有仔細使用,反射可能會失敗。我剛剛寫的這個方法工作正常,如果類有一個沒有參數的構造函數。例如,instantiator(String.class);instantiator(Exception.class);會正常工作,因爲有一個空的構造函數,但instantiator(Integer.class)不會運行。

+0

@Tom鏈接到上面的SO問題回答了我的問題的第一部分,這回答了第二部分。 – user1889776