2011-07-12 44 views
3

我在Java中遇到了最好的技術問題。我有一個實現一些通用方法的基類。一堆繼承的類。現在我必須隨機選擇一個繼承的類。我的方法如下:從Java中的一堆類中隨機選擇

  1. 具有對象的陣列爲每個繼承的類
  2. 隨機生成用於陣列
  3. 在隨機創建對象的一個​​實例的索引從2.索引與的newInstance()

代碼〔實施例爲步驟1:

Class[] possibleClasses = {Class1.class, Class2.class}

這是一個足夠的方法嗎?例如,Eclipse Indigo語法校正針對上面的代碼示例說:「類是原始類型,對泛型類的引用應該被參數化」。那麼沒有泛型的定義可能有副作用呢?

斯特凡

回答

2

你的方法很好 - 事實上它可能是最簡單,最有效的辦法。

如果你想避免編譯器警告,你可以按照如下添加一個泛型類型參數:

Class<?>[] possibleClasses = new Class[]{Class1.class, Class2.class} 

然而,這只是給你一個不同的警告(未經檢查的轉換),所以你可能也只是抑制原直接警告。

稍微複雜一些的替代方法是使用反射來遍歷類層次並自動將基類的所有子類添加到類的ArrayList。好處是,你不需要單獨列出所有的子類,它會自動獲取所有新增的子類。

+0

我不認爲你的代碼編譯。它應該是:'類 [] possibleClasses = {Class1.class,Class2.class}' –

+0

我認爲你需要在這個實例中轉換數組,以防止編譯器呻吟通用數組的創建。 – Adamski

+0

ah yes good spot .... will edit – mikera

1
Class<? extends Collection>[] klazzes = 
    (Class<Collection>[]) new Class[]{ List.class, Set.class }; 
2

因爲沒有人把這個變成一個答案,我會說這:使用List。數組不能很好地處理泛型類型。

List<Class<? extends MyBaseClass>> possibleClasses = Arrays.asList(Class1.class, Class2.class); 

的Java 7之前,這將產生一個無害的警告:

​​

這可以安全地忽略或抑制,也可以代替做到這一點:

List<Class<? extends MyBaseClass>> possibleClasses = new ArrayList<...>(); 
possibleClasses.add(Class1.class); 
//... 

然後您就可以生成隨機索引並使用possibleClasses.get(i)

+0

謝謝,不要想到這個問題(羞恥對我):) – Stefan

0

好吧,人們似乎很難提出代碼。你應該這樣做:

Class<?>[] cls = {Class1.class, Class2.class}; 
Random r = new Random(); 
Class<?> = cls[r.nextInt(cls.length)]; 

你應該重新使用調用Random的實例來調用以確保分配。