2016-11-07 53 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