Попытка изменить Java Vector get (), чтобы сделать новый T (), если элемент является нулевым - PullRequest
0 голосов
/ 09 ноября 2019

Я пытаюсь изменить 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();  
        }
    }

1 Ответ

1 голос
/ 09 ноября 2019

Нет гарантии, что 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.

...