2014-03-29 48 views
0

我有一個數據庫,其中有一個類名稱列表,我想放在一個List<MyInterface>使用Class.forName()並實例化類

我這樣做:

List<MyInterface> list = new ArrayList<MyInterface>(); 
for(...) { 
    MyInterface obj = (MyInterface)Class.forName(myClassString).newInstance(); 
    list.add(obj); 
} 

這工作得很好。

有什麼辦法可以將新實例投入myClassString而不是接口?

喜歡的東西:

​​
+0

這部分不可能是正確的:'新名單()'你不能實例化'名單'interface –

+0

會發生什麼變化?由於您調用該類的構造函數來獲取實例,因此該對象的具體類型屬於myClassString中的類型。施放它不會改變任何東西。 –

+0

因爲在我想使用的接口中沒有具體類中的方法。所以將它投入界面將無法工作。我想我將不得不做一個如果塊... – mmaceachran

回答

1

當然,只要你知道具體類:

List<MyClass> list = new ArrayList<MyClass>(); 
for (...) { 
    MyClass obj = (MyClass) Class.forName(myClassString).newInstance(); 
    list.add(obj); 
} 

...但它是一個更好的面向對象的做法是使用接口,而不是具體的類,所以我會保留代碼 - 沒有任何更改。

0

如果你知道實際的類,不使用Class.forName(),只需使用new

MyClass obj = new MyClass(); 
+0

爲什麼? PLZ解釋 –

+0

@ HussainAkhtarWahid'Ghouri'當我讀到問題時,最終的類名知道,然後直接使用它。 – Bohemian

+0

我期待不直接使用它的缺點 –