2016-11-07 62 views
1

我是java新手,所以我不知道這個技術叫什麼,我可能在解釋事情上很窮,但我知道你明白。使用已確定的默認成員類型擴展ArrayList

假設我有此兩類,項目和它可能會擴展到ExtendedItem

public class Item { } 

public class ExtendedItem extends Item {} 

我想爲它創建集合包裝,所以我創建的ArrayList擴展一個類...(方案1)

public class DataSet extends ArrayList<Item> {} 

然後現在初始化

DataSet dataset1 = new DataSet(); 
DataSet<ExtendedItem> dataset2 = new DataSet<ExtendedItem >(); 

dataset1.get(0) // yield Item instance... which is in this case, correct 
dataset2.get(0) // also yield Item instance 

,當我與克定義數據集eneric型...(方案2)

public class DataSet<T extends Item> extends ArrayList<Item> {} 

它產生

DataSet dataset1 = new DataSet(); 
DataSet<ExtendedItem> dataset2 = new DataSet<ExtendedItem >(); 

dataset1.get(0) // yield Object instance.... dont't want this 
dataset2.get(0) // yield ExtendedItem instance... correct 

有什麼辦法(場景),所以這兩個數據集的產量正確的類型以「項目」爲默認類型?像這個:

DataSet dataset1 = new DataSet(); 
DataSet<ExtendedItem> dataset2 = new DataSet<ExtendedItem >(); 

dataset1.get(0) // yield Item instance 
dataset2.get(0) // yield ExtendedItem instance 

---------------------------編輯------------ ---------------

我可能找到了解決辦法:

public class DataSet<E extends Item> extends ArrayList<E> implements List<E>, RandomAccess, Cloneable, Serializable { 
    @Override 
    public E get(int i) { 
     return super.get(i); 
    } 

    @Override 
    public int size() { 
     return super.size(); 
    } 
} 

與:

DataSet dataset1 = new DataSet(); 
DataSet<ExtendedItem> dataset2 = new DataSet<ExtendedItem >(); 

dataset1.get(0) // yield Item instance... correct 
dataset2.get(0) // yield ExtendedItem instance... correct 
+1

可能的重複http://stackoverflow.com/questions/6101568/java-how-to-set-a-default-for-t-in-someclasst –

回答

2

不要使用原始類型。

變化

DataSet dataset1 = new DataSet(); 

DataSet<Item> dataset1 = new DataSet<Item>(); 

然後dataset1.get(0)將返回Item

你也應該改變

public class DataSet<T extends Item> extends ArrayList<Item> {} 

public class DataSet<T extends Item> extends ArrayList<T> {} 

否則dataset2.get(0)也將返回Item而不是ExtendedItem

+0

感謝您的回覆,我結束了發現其他解決方案:) – 1412

+1

@ 1412請注意伊蘭的建議。您的解決方案似乎可行,但存在一些細微問題。 –

+0

感謝您的建議,您能否詳細說明可能發生的問題?爲教育目的 – 1412