我不知道這是可能的,但我想知道的是以下幾點:Java的聲明由用戶選擇的類型的對象
比方說,我有一個包含2數組不同類類型:
Fruit[] fruit;
fruit[0]= new Banana();
fruit[1]= new Apple();
我想要做的是這樣的:
Fruit unknown= new fruit[0].getClass();
我要聲明這是由用戶選擇的類型的對象。我可以做嗎?
我不知道這是可能的,但我想知道的是以下幾點:Java的聲明由用戶選擇的類型的對象
比方說,我有一個包含2數組不同類類型:
Fruit[] fruit;
fruit[0]= new Banana();
fruit[1]= new Apple();
我想要做的是這樣的:
Fruit unknown= new fruit[0].getClass();
我要聲明這是由用戶選擇的類型的對象。我可以做嗎?
這不是非常困難 - 你大部分都是在那裏。有一個在Class
界面,您可以使用這樣的所謂newInstance()
方法:
Fruit userFruit = (Fruit) Class.forName(input).newInstance();
(其中input
是包含代表用戶的選擇一類名稱的String)返回你的類型的新實例。
我已經完全搞砸了我的答案,但它被'接受',所以我從下面偷了亞當賴斯的答案只是爲了讓我的權利爲未來的讀者。亞當值得這個代表,但我不知道如何給他。 –
哦,但實際上我只是需要知道函數newInstance(),因爲你是我第一次接受你的函數。 – Christian
是的,但是對於未來的讀者來說也是如此,所以應該儘可能的正確。 –
我假設用戶會說他們想要一個「蘋果」或「香蕉」,即你會得到輸入作爲一個字符串。在這種情況下,這可能是你需要的。
Fruit f = (Fruit) Class.forName("Banana").newInstance();
fruit[0] = f;
嘿亞當,我偷了你的答案,對不起。我已經通過查找您在SO上發佈的其他帖子並提出了很好的帖子來彌補了代表的不足。 –
謝謝,我很感激。 –
而不是使用反射,考慮使用工廠和策略設計模式的組合。讓輸入處理代碼檢查輸入以查看他們想要的東西,然後選擇一個工廠/策略對象。然後,稍後,當您需要創建的對象時,請讓Factory/Strategy對象創建它。
研究Java「反思」。如果你真的需要做動態編程(這就是你的問題所暗示的),那麼Java可能不是正確的語言。 –
這是完全可能的,並不難。谷歌Java反射 –
另請參見http://stackoverflow.com/q/36272566/3888450 –