Как установить случайные значения в универсальном классе

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

}

Спасибо и наилучшие пожелания, Патрик

Не зная точно вашего описания назначения, это звучит как ужасное назначение для дженериков, если намерение действительно состоит в том, чтобы сохранить объект Любые в том же списке. Тогда это в основном ArrayList<Object>, и дженерики не очень полезны для этого случая.

Mick Mnemonic 23.03.2019 20:36

Возможный дубликат Получить общий тип класса во время выполнения

Sean Van Gorder 25.03.2019 17:56

Невозможно получить тип времени выполнения T внутри метода Buffer<T>, если только вы не передадите экземпляр Class<T> конструктору и не сохраните его в поле. Вы уверены, что это то, что требует задание?

Sean Van Gorder 25.03.2019 17:59
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
3
230
3

Ответы 3

Во-первых, вы не можете использовать примитивы вроде int вместо ArrayLists. Вместо этого вы должны использовать соответствующий класс. В этом случае Integer. Второй момент: я думаю, вы можете проверить, какой тип содержит ArrayList, выполнив T.class.equals(Integer.class).

Спасибо за ответ! К вашему первому замечанию: я использовал метод вставки, как указано выше, и я думаю, что он работает из-за автобокса. Поскольку я думал, что это может быть проблематично, я уже пытался привести свои переменные к (Integer) или (Double). ко второму пункту: я только что попробовал T.class.equals(Integer.class); но Eclipse говорит мне "недопустимый литерал класса для параметра типа T"

AtMakeIT 23.03.2019 19:57

Скажем, даже если вы использовали дженерики и Т является двойным, вы никак не можете добавить к нему Нить. Это означает, что нет смысла проверять тип класса.

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, один из которых содержит только целые числа, а другой - только символы. Так что их не следует смешивать вместе

AtMakeIT 23.03.2019 19:58

Затем создайте свой объект, например Buffer<Object> bd = new Buffer<Object>(10);. Теперь вы можете Добавить что угодно, не выполняя проверки тип.

Nicholas Kurian 23.03.2019 20:00

Как вариант, вы можете предоставить 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 23.03.2019 20:04

@AtMakeIT, я не совсем уверен в ваших требованиях, но, очевидно, вы знаете тип объектов, которые нужно хранить в буфере, когда вы создаете буфер. Итак, возможно, вы хотите вынести метод insertRandom() из класса Buffer и заполнить его на основе того же условия, что и вы его создали.

Pavel Smirnov 23.03.2019 20:08

Другие вопросы по теме