2016-03-06 85 views
2

我有一個ArrayListBagWithRandomSelect不同類型。所以arrayList.get(1)可以返回一個BagWithRandomSelect<Integer>對象,而arrayList.get(2)可能返回一個BagWithRandomSelect<String>對象。是否有可能編寫一種方法將BagWithRandomSelect中的元素作爲自己的類型返回,而不是返回需要投射的Object從集合ArrayList中返回一個元素,其中每個集合具有不同的元素類型

我的問題出在方法testGetFromColumn()

public class BagWithRandomSelect<E> { 
    ArrayList<E> bag; 
    public BagWithRandomSelect() { 
     this.bag = new ArrayList<>(); 
    } 
    public void add(E element) { 
     this.bag.add(element); 
    } 
    public E randomSelect() { 
     Random rnd = new Random(); 
     int rndInt = this.rnd.nextInt(bag.size); 
     return this.bag.get(rndInt); 
    } 
} 

public class DatafileCreator { 
    ArrayList<BagWithRandomSelect> columnList; 
    public DatafileCreator() { 
     this.columnList = new ArrayList<Stack>(); 
    } 

    // skipping some methods... 

    public void addNewColumn(BagWithRandomSelect bag, String s) { 
     this.columnList.add(bag); 
    } 

    public Object testGetFromColumn(int columnNum) { 
     BagWithRandomSelect<Object> bag = this.columnList.get(columnNum); 
     return bag.randomSelect(); 
    } 
} 
+0

您是否嘗試過的instanceof? – sAm

回答

0

是的,它是可能的,但你必須知道會發生什麼類型的對象。但是由於你必須在使用Object時施放,這應該不成問題。

public <T> T testGetFromColumn(int index, Class<T> clazz) { 
    BagWithRandomSelect<?> bag = columnList.get(index); 
    return clazz.cast(bag.randomSelect()); 
} 

注意,你必須在這裏使用Class對象這個明確的轉換 - 正常投不會檢查如果轉換是在運行時有效,由於類型擦除果然return (T) item;return (Object) item;。你可以得到真正討厭的錯誤,否則例如ClassCastExceptions沒有強制轉換出現在失敗的代碼中。

然後可以使用這樣的方法:

DatafileCreator creator = ...; 
... 
String s = creator.testGetFromColumn(5, String.class); 
Integer i = creator.testGetFromColumn(3, Integer.class); 
相關問題