Я пытаюсь заполнить ArrayLists случайными значениями. Списки массивов могут содержать строки, целые числа, двойные числа или символы. Создание случайных значений работает нормально, но моя проблема в том, что я не могу написать свой метод insertRandom. Он должен вставлять данные определенного типа (например, double, int и т. д.). Ниже я описал, что я хочу, чтобы мой метод insertRandom делал. Я получаю предупреждение «Метод вставки (T) в буфере типов неприменим для аргументов (int). Я погуглил, но не нашел / не понял, как привести мои значения к объектам T или как проверить (аналогично тому, что делает «instanceof»), какие типы данных содержат мои ArrayLists. Я уже читал о типах классов, которые люди использовали в качестве параметров в своем конструкторе, но мне не разрешено изменять список параметров моего конструктора.
public class Buffer <T> {
private ArrayList<T> list;
// constructor
public Buffer (int capacity) {
this.list = new ArrayList<T>();
}
// insert items to buffer
public void insert (T item) {
list.add(item);
}
// insert random values
public void insertRandom () {
check if ArrayList is of type String / Integer / Double
if (ArrayList is-of-type-String) {
insert("ThisString");
}
if (ArrayList is-of-type-Double) {
insert(3.4);
}
}
Спасибо и наилучшие пожелания, Патрик
Возможный дубликат Получить общий тип класса во время выполнения
Невозможно получить тип времени выполнения T внутри метода Buffer<T>, если только вы не передадите экземпляр Class<T> конструктору и не сохраните его в поле. Вы уверены, что это то, что требует задание?




Во-первых, вы не можете использовать примитивы вроде int вместо ArrayLists. Вместо этого вы должны использовать соответствующий класс. В этом случае Integer.
Второй момент: я думаю, вы можете проверить, какой тип содержит ArrayList, выполнив T.class.equals(Integer.class).
Спасибо за ответ! К вашему первому замечанию: я использовал метод вставки, как указано выше, и я думаю, что он работает из-за автобокса. Поскольку я думал, что это может быть проблематично, я уже пытался привести свои переменные к (Integer) или (Double). ко второму пункту: я только что попробовал T.class.equals(Integer.class); но Eclipse говорит мне "недопустимый литерал класса для параметра типа T"
Скажем, даже если вы использовали дженерики и Т является двойным, вы никак не можете добавить к нему Нить. Это означает, что нет смысла проверять тип класса.
Buffer<Double> bd = new Buffer(10);
bd.insert(22.9);
bd.insert("string"); // compiler error
Я не думаю, что вам нужен дженерики здесь. Все, что вам нужно, это Buffer<Object>, потому что в соответствии с вашими требованиями вам нужно добавить строки, целые числа, двойные числа или символы. Так что вам даже не нужно делать проверку типа.
Что-то типа:
Buffer<Object> buff = new Buffer<Object>(10);
buff.insert(22.9);
buff.insert("");
buff.insert(13);
Привет, Николас, к сожалению, мне приходится использовать класс "public class Buffer <T> {}" для моей домашней работы... и я пытаюсь получить 3 разных ArrayList, один из которых содержит только целые числа, а другой - только символы. Так что их не следует смешивать вместе
Затем создайте свой объект, например Buffer<Object> bd = new Buffer<Object>(10);. Теперь вы можете Добавить что угодно, не выполняя проверки тип.
Как вариант, вы можете предоставить Class объекта конструктору и проверить этот класс в методе insertRandom(), что-то вроде:
public class Buffer <T> {
private final Class<T> type;
private ArrayList<T> list;
// constructor
public Buffer (int capacity, Class<T> type) {
this.list = new ArrayList<T>();
this.type = type;
}
// insert items to buffer
public void insert (T item) {
list.add(item);
}
// insert random values
public void insertRandom () {
// check if ArrayList is of type String / Integer / Double
if (type == String.class) {
insert((T)"ThisString");
}
if (type == Double.class) {
insert((T)Double.valueOf(3.4));
}
}
}
Добрый день Павел, спасибо за ответ! Это одно из решений, которые я видел в Интернете, но моя проблема в том, что мне не разрешено изменять список параметров моего конструктора. Есть ли другой способ узнать тип без изменения конструктора?
@AtMakeIT, я не совсем уверен в ваших требованиях, но, очевидно, вы знаете тип объектов, которые нужно хранить в буфере, когда вы создаете буфер. Итак, возможно, вы хотите вынести метод insertRandom() из класса Buffer и заполнить его на основе того же условия, что и вы его создали.
Не зная точно вашего описания назначения, это звучит как ужасное назначение для дженериков, если намерение действительно состоит в том, чтобы сохранить объект Любые в том же списке. Тогда это в основном
ArrayList<Object>, и дженерики не очень полезны для этого случая.