使用确定的默认成员类型扩展 ArrayList
我是 Java 新手,所以我不知道这种技术叫什么,而且我可能不擅长解释事情,但我希望你能理解.
i am new at java, so i don't know what this technique called, and i may be poor at explain things, but i hpe you understand.
假设我有这两个类,Item,它可能会扩展到 ExtendedItem
Assume i have this two class, Item and it might be extended to ExtendedItem
public class Item { }
public class ExtendedItem extends Item {}
我想为它创建集合包装器,所以我创建了一个从 ArrayList 扩展的类...(场景 1)
i want to create collection wrapper for it, so i create a class extended from ArrayList... (Scenario 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
现在,当我定义具有泛型类型的 DataSet 时...(场景 2)
now, when i define DataSet with generic type... (Scenario 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
有没有办法(场景)使两个数据集都产生正确的类型,并将Item"作为默认类型?,就像这样:
is there any way (scenario) so both data set yield correct type with "Item" as the default type?, like this:
DataSet dataset1 = new DataSet();
DataSet<ExtendedItem> dataset2 = new DataSet<ExtendedItem >();
dataset1.get(0) // yield Item instance
dataset2.get(0) // yield ExtendedItem instance
--------------------------- 编辑 ---------------------------
我可能找到了解决方案:
I might found the solution:
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
不要使用原始类型.
改变
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
.
Otherwise dataset2.get(0)
will also return Item
instead of ExtendedItem
.