2015-09-23 39 views
0

代碼第一:)避免關於類的未經檢查的轉換異常的警告?

/** 
    * 
    * @param arrayList the ArrayList 
    * @return a random object from the ArrayList 
    */ 
    public static Object randomArrayListObject(ArrayList<?> arrayList) { 

     Random random = new Random(); 
     int i = random.nextInt(arrayList.size()); 
     assert i >= 0; 
     assert i < arrayList.size(); 
     return arrayList.get(i); 

    } 

    public static Class<? extends Juice> randomArrayListJuiceClass(
      ArrayList<Class<? extends Juice>> arrayList) { 

     final Object o = randomArrayListObject(arrayList); 
     assert Juice.class.isAssignableFrom((Class) o); 
     if (Juice.class.isAssignableFrom((Class) o)) { 
      @SuppressWarnings("unchecked") 
      Class c = (Class<? extends Juice>) o; 
      return c; 
     } else throw new RuntimeException("wtf? not a Juice Class??"); 
    } 

我得到這樣的警告:

未選中分配: 'java.lang.Class中的' 到「的java.lang.Class <? 擴展drinks.Juice >「

我把所有的怪物代碼randomArrayListJuiceClass()要儘量避免這樣的警告,但我仍然無法弄清楚。我能做什麼?

我的目標就是返回(某種)Juice類沒有警告......我知道,我只喂randomArrayListJuiceClass()一些Juice,我只是以防萬一拋出Exception我是草率和餵它別的東西。

我該怎麼辦?

回答

3

您的得到一個隨機元素應該是通用的,它的返回類型綁定到輸入的類型的方法ArrayList

public static <T> T randomArrayListObject(ArrayList<T> arrayList) { 

你的其他代碼就變成

final Class<? extends Juice> o = randomArrayListObject(arrayList); 
assert Juice.class.isAssignableFrom(o); // even this is kind of useless 
return o; 

假設你的說法是對,你將不需要拋出另一個異常。

+0

謝謝,我會試試這個 – ycomp

相關問題