Мне необходимо создать класс очереди, который принимает обобщенный тип T, который будет в нем содержаться.
В качестве контейнера для T я должен использовать универсальный список List. Конкретная реализация (например, ArrayList или LinkedList) должна быть указана при вызове конструктора Queue в качестве параметра.
Прямо сейчас я реализовал класс как Queue<T>
, и конструктор принимает класс некоторого класса. вид, который расширяет List<T>
.
Таким образом, я должен иметь возможность создать новый экземпляр списка, используя getDeclaredConstructor().newInstance()
.
import java.lang.reflect.InvocationTargetException;
import java.util.List;
// FIFO QUEUE
public class Queue<T> {
private List<T> list;
public Queue(Class<? extends List<T>> aClass) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
list = aClass.getDeclaredConstructor().newInstance();
}
public boolean put(T element) {
return list.add(element);
}
public T get() {
T result = null;
if (list.size() > 0) {
result = list.remove(0);
}
return result;
}
public boolean empty() {
return list.isEmpty();
}
}
Затем я пытаюсь создать новый экземплярочереди в основном:
ArrayList<Integer> arrayList = new ArrayList<>();
Queue<Integer> queue = new Queue<>(arrayList.getClass());
В настоящее время я использую IntelliJ IDEA и не могу скомпилировать код.
Я получаю сообщение об ошибке (Cannot infer arguments
), указывающее на new Queue<>
.
Как правильно вызывать конструктор при сохранении инкапсуляции?