java - 尝试修改 Java Vector 的 get() 以在元素为 null 时创建 new T()

标签 java vector new-operator

如果我访问的元素大于 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/

相关文章:

Java 允许在枚举类型中声明抽象方法,但它是最终类而不是抽象类

c++ - 将 vector 传递给函数 c++

javascript - 使新关键字可选

c++ operator new 这在内部是如何工作的

c# - 函数的 "static new"修饰符有什么意义?

Java - 如何使表单返回值?

java - 使用集合加载 DTO

c++ - 缓慢的文件读取和复制到内存中 - C++

javascript - Three.js - 围绕特定 Axis 旋转球体

java - 删除除引号中的内容之外的所有内容 java