如果元素为空,则尝试修改 Java Vector 的 get() 以生成新的 T()
Trying to modify Java Vector's get() to make new T() if the element is null
我正在尝试修改 Java 向量以增加大小,如果我访问的元素大于向量的大小。如果我正在访问未初始化的元素,则插入一个新元素。
Eclipse throws 无法实例化类型 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 向量以增加大小,如果我访问的元素大于向量的大小。如果我正在访问未初始化的元素,则插入一个新元素。
Eclipse throws 无法实例化类型 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。