Входные данные времени выполнения объектов ArrayList обрабатываются как строки

Я пытаюсь добавить объекты в ArrayList, во время статических входов все работает нормально

class ArrayListDemo4
{
    public static void main(String[] args) 
    {
        Collection cl = new ArrayList();
        cl.add(true);cl.add("Hello");cl.add(6.55f);cl.add(566);
        out.println(cl);

        for(Object o: cl)
            System.out.println(o.getClass());
    }
}

Вывод:

D:\COLLECTIONS>java ArrayListDemo4
[true, Hello, 6.55, 566]
class java.lang.Boolean
class java.lang.String
class java.lang.Float
class java.lang.Integer

Когда я пытаюсь сделать то же самое с вводом во время выполнения, getClass() дает только строку. Я заметил, что next() имеет 2 подписи с разными типами возвратаpublic java.lang.String next(), public java.lang.Object next() и обобщенный консольный ввод в Object

class ArrayListDemo3 
{
    public static void main(String[] args) 
    {
        Scanner  input = new Scanner(in);
        List cl = new ArrayList(4);

        out.println("Enter the objects to the ArrayList:");
        for (int i =0; i < 4; i++ )
        {out.print("cl["+i+"]   =  ");  cl.add((Object)input.next());   }
        out.println(cl);

        for(Object o: cl)
        {out.println(o.getClass());}
    }
}

Вывод:

Enter the objects to the ArrayList:
cl[0]   =  true
cl[1]   =  Hello
cl[2]   =  6.55f
cl[3]   =  566
[true, Hello, 6.55f, 566]
class java.lang.String
class java.lang.String
class java.lang.String
class java.lang.String

Может ли кто-нибудь исправить/помочь мне: как мне получить соответствующие типы объектов для введенных значений во время выполнения?

? вы ЯВЛЯЮТСЯ добавляете строки в ArrayList. Почему результат вас удивляет?

Hovercraft Full Of Eels 18.02.2019 16:26

Вы используете объект Scanner и вызываете его метод .next() — что сообщает Scanner API, что возвращает этот метод?

Hovercraft Full Of Eels 18.02.2019 16:27

«Я заметил, что next() имеет 2 подписи с разными типами возврата: public java.lang.String next(), public java.lang.Object next()», где вы это заметили? Можете ли вы связать нас с документацией обоих методов?

Pshemo 18.02.2019 16:28

Ссылка: Метод API сканера .next()

Hovercraft Full Of Eels 18.02.2019 16:28

@HovercraftFullOfEels: мне было интересно, сможет ли JVM преобразовывать входные данные в соответствующие объекты в cl.add((Object)input.next()), а getClass() даст результат, аналогичный первому.

Sai Kiran 18.02.2019 16:30

@Pshemo javap java.util.Scanner | findstr next() на ПК с Windows, разница только в типе возвращаемого значения

Sai Kiran 18.02.2019 16:31

@SaiKiran: в программировании нет «магии», и JVM знает только то, что вы ей даете. Вы добавляете строки и только строки в ArrayList, и это все, что знает JVM. Обратите внимание, что в Java не используется «утиная типизация», а эта информация имеет статический тип.

Hovercraft Full Of Eels 18.02.2019 16:32

То, что вы видите как Object next(), происходит от E next(), объявленного в Iterator, который реализует Сканер, и отменяет этого метода для String next(), который является единственным методом, доступным от Сканера.

Pshemo 18.02.2019 16:33

@HovercraftFullOfEels: похоже, я пропустил этот момент, мне было просто любопытно, когда add() может принимать объекты в качестве аргументов при компиляции, но почему не динамически. Спасибо за разъяснение :), есть плюс

Sai Kiran 18.02.2019 16:38

@Pshemo: Спасибо, я должен был пройти и через них.

Sai Kiran 18.02.2019 16:39
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
10
45
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обратитесь к javadoc java.util.Scanner, и вы обнаружите, что next() всегда возвращает String.

В то же время java.util.Scanner имеет множество методов для получения значений определенных типов: nextBoolean(), nextByte() и т. д.

Кроме того, я настоятельно рекомендую: не используйте коллекции необработанных типов. Java имеет довольно хороший механизм дженериков. Итак, если вы находитесь в процессе обучения — здесь — хороший ресурс для начала.

Спасибо, я пройду через это

Sai Kiran 18.02.2019 17:50

Он был находчив, смог изучить это, используя дженерики и безопасность типов для целых чисел cl[0] = 45 000 cl[1] = 125 000 cl[2] = 17 500 cl[3] = 8000 cl[4] = 4005 [45000, 125000, 17500, 8000, 4005]`

Sai Kiran 18.02.2019 19:09

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