java - 使用确定的默认成员类型扩展 ArrayList

标签 java generics arraylist

我是java新手,所以我不知道这种技术叫什么,而且我可能不擅长解释事情,但我希望你能理解。

假设我有这两个类,Item,它可能会扩展到 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

现在,当我用泛型类型定义 DataSet 时...(场景 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”作为默认类型?,如下所示:

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

最佳答案

不要使用原始类型。

改变

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

关于java - 使用确定的默认成员类型扩展 ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40466553/

相关文章:

java - 使用 JPA 重新创建表结构

java - 在java中显示字符串ascii值的字体

java - 我如何在Android中实现 fragment 的通用ArrayList?

java - 为什么要返回 Iterator 低耦合 (OOP)?

Java ArrayList 似乎在 init 方法之后无效

java - 你应该在 `onBillingServiceDisconnected()` 里放什么?

Java 最佳实践静态最终映射值

java - 在 ovverriden 方法中使用多态泛型

Java 多态泛型调用

Java - 从另一个类的 ArrayList 中读取