Я пытаюсь добавить объекты в 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
Может ли кто-нибудь исправить/помочь мне: как мне получить соответствующие типы объектов для введенных значений во время выполнения?
Вы используете объект Scanner и вызываете его метод .next() — что сообщает Scanner API, что возвращает этот метод?
«Я заметил, что next() имеет 2 подписи с разными типами возврата: public java.lang.String next(), public java.lang.Object next()», где вы это заметили? Можете ли вы связать нас с документацией обоих методов?
Ссылка: Метод API сканера .next()
@HovercraftFullOfEels: мне было интересно, сможет ли JVM преобразовывать входные данные в соответствующие объекты в cl.add((Object)input.next()), а getClass() даст результат, аналогичный первому.
@Pshemo javap java.util.Scanner | findstr next() на ПК с Windows, разница только в типе возвращаемого значения
@SaiKiran: в программировании нет «магии», и JVM знает только то, что вы ей даете. Вы добавляете строки и только строки в ArrayList, и это все, что знает JVM. Обратите внимание, что в Java не используется «утиная типизация», а эта информация имеет статический тип.
То, что вы видите как Object next(), происходит от E next(), объявленного в Iterator, который реализует Сканер, и отменяет этого метода для String next(), который является единственным методом, доступным от Сканера.
@HovercraftFullOfEels: похоже, я пропустил этот момент, мне было просто любопытно, когда add() может принимать объекты в качестве аргументов при компиляции, но почему не динамически. Спасибо за разъяснение :), есть плюс
@Pshemo: Спасибо, я должен был пройти и через них.




Обратитесь к javadoc java.util.Scanner, и вы обнаружите, что next() всегда возвращает String.
В то же время java.util.Scanner имеет множество методов для получения значений определенных типов: nextBoolean(), nextByte() и т. д.
Кроме того, я настоятельно рекомендую: не используйте коллекции необработанных типов. Java имеет довольно хороший механизм дженериков. Итак, если вы находитесь в процессе обучения — здесь — хороший ресурс для начала.
Спасибо, я пройду через это
Он был находчив, смог изучить это, используя дженерики и безопасность типов для целых чисел cl[0] = 45 000 cl[1] = 125 000 cl[2] = 17 500 cl[3] = 8000 cl[4] = 4005 [45000, 125000, 17500, 8000, 4005]`
? вы ЯВЛЯЮТСЯ добавляете строки в ArrayList. Почему результат вас удивляет?