2012-04-30 98 views
1

實例化一個具體IMPL如果我有一個名爲Widget類,那麼我可以創建下面的代碼一個新的(或多或少):Java語言:名稱

Class<?> widgetClass = Class.forName("Widget"); 
Widget widget = (Widget)widgetClass.newInstance(); 

但如果我有一個接口, Fruit,以及幾個具體實現(如AppleOrangeKiwi)?如果我嘗試:

Class<?> fruitClass = Class.forName("Apple"); 
Fruit fruit = (Fruit)fruitClass.newInstance(); 

我得到一個錯誤:

Fruit cannot be resolved to a type.

如果我刪除了明確的鑄造,像這樣:

Fruit fruit = fruitClass.newInstance(); 

我得到一個不同的錯誤:

Type mismatch: cannot convert from capture#2-of ? to Fruit.

那麼我該如何使用一個字符串來實例化Fruit結核我想要

回答

2

你可能只是忘了進口水果接口:

import com.foo.bar.Fruit; 

注:NEVER使用默認的包。總是把你的課程放在一個包裏。

其他注意:如果類的名稱不是從某個外部資源(文件,數據庫,任何)動態讀取的,而是如問題中所示的硬編碼,則應該簡單地調用其構造函數:

Fruit f = new Apple(); 
1

你的代碼沒有問題。但是,您的Fruit類不在編譯類路徑中,因此編譯器錯誤。

2

錯誤消息「水果無法解析爲某種類型」表示您的輸入/構建路徑設置不正確。

否則,它看起來像你的代碼是正確的。