【问题标题】:Extending ArrayList with determined default member type使用确定的默认成员类型扩展 ArrayList
【发布时间】:2016-11-07 13:36:24
【问题描述】:

我是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

【问题讨论】:

标签: java generics arraylist


【解决方案1】:

不要使用原始类型。

改变

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

【讨论】:

  • 感谢您的回复,我最终找到了其他解决方案:)
  • @1412 请听从 Eran 的建议。您的解决方案可能看起来有效,但存在一些微妙的问题。
  • 感谢您的建议,您能否详细说明可能出现的问题?用于教育目的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-07
  • 2020-10-16
  • 2013-04-23
  • 1970-01-01
  • 2017-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多