如果我访问的元素大于 vector 的大小,我正在尝试修改 Java Vector 以提高大小。如果我访问未初始化的元素,则插入新元素。
Eclipse 抛出无法实例化类型 Obj 的错误。
public static class Vec<Obj> extends Vector<Obj> {
@Override
public Obj set(int a, Obj b) {
if (super.size()<=a) super.setSize(a+1);
return (Obj) super.set(a,b);
}
@Override
public Obj get(int a) {
if (super.size()<=a) super.setSize(a+1);
if (super.get(a)==null) super.insertElementAt( new Obj() , a);
return (Obj) super.get(a);
}
public Vec () {
super();
}
}
最佳答案
无法保证 T
有一个无参数构造函数。另外,人们喜欢使用界面,所以这是一个很好的机会 T
不会具体。
因此,提供一个抽象工厂来构建您的 Vec
。合适的类型是 java.util.function.Supplier<T>
.
private final Supplier<T> dflt;
public Vec(Supplier<T> dflt) {
super();
this.dflt = Objectes.requireNonNull(dflt);
}
...
if (super.get(a)==null) {
super.insertElementAt(dflt.get(), a);
}
构造为:
Vec<Donkey> donkeys = new Vec<>(BigDonkey::new);
java.util.Vector
方法应该是synchronized
,尽管这样的锁定并不是真正有用并且 ArrayList
一般应使用。即使如此,像这样的子类化也会破坏 LSP。
关于java - 尝试修改 Java Vector 的 get() 以在元素为 null 时创建 new T(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58781513/