如果元素为空,则尝试修改 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。