Можно ли создать обобщенный c класс с пустым конструктором в Java - PullRequest
0 голосов
/ 28 февраля 2020

Можно ли создать обобщенный c класс с пустым конструктором?

Примерно так:

 public class ArrayListGeneric1<T> {
    private int capacity;
    private int size;
    private T [] array;


    public ArrayListGeneric1() {
        capacity = 1;
        array =  Array.newInstance(T.getClass(), capacity); //Cannot get the class for T
        size = 0;
    }
}

Я могу найти решения только там, где нам нужно передать элемент

Ответы [ 3 ]

2 голосов
/ 28 февраля 2020

Можно ли создать обобщенный c класс с пустым конструктором?

Конечно, сделать это без универсального c массива, как это делает ArrayList:

 public class ArrayListGeneric1<T> {
    private int capacity = 1;
    private int size = 0;
    private Object[] array = new Object[capacity];

    public ArrayListGeneric1() {}

    public T get(int i) {
      return (T) array[i];
    }

    public void set(int i, T element) {
      array[i] = element;
    }
}

На самом деле вы можете сделать это с массивом generi c, если вы сделаете тип абстрактным и создадите подкласс при создании экземпляра:

  public abstract class ArrayListGeneric1<T> {
    private int capacity = 1;
    private int size = 0;
    private T[] array = Array.newInstance(getElementType(), capacity);

    public ArrayListGeneric1() {}   

    Class<?> getElementType() {
      ParameterizedType pt = (ParameterizedType) getClass().getGenericSuperclass();
      Type[] typeArgs = pt.getActualTypeArguments();

      // Will fail if it's not a class type.
      return (Class<?>) typeArgs[0];
    }
  // ...
}

Тогда :

ArrayListGeneric1<String> list = new ArrayListGeneric1<String>() {}

Демонстрация: https://ideone.com/fgJ5dl

1 голос
/ 28 февраля 2020

Да. Ниже приведен пример из Java OOTB класса:

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{

    private int size;

    public ArrayList(int initialCapacity) {
        super();
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        this.elementData = new Object[initialCapacity];
    }

    /**
     * Constructs an empty list with an initial capacity of ten.
     */
    public ArrayList() {
        this(10);
    }
    ...
    ...
    ...
 }
1 голос
/ 28 февраля 2020

Это не проблема. ArrayList - это обобщенный класс c с конструктором без аргументов:

List<Integer> a = new ArrayList<>();
List b = new ArrayList<>();
var c = new ArrayList<>();

Пример реализации можно найти здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...