/ / Как може да се добави цяло число към String ArrayList? - java, arraylist

Как може да се добави цяло число към String ArrayList? - java, аралист

List list = new ArrayList<String>() ;
list.add(1) ;
Integer hello = (Integer) list.get(0) ;
System.out.println(hello);

Горният код има референтен тип списък позовавайки се на инстанция на ArrayList от типа низ, Когато линията list.add(1) се изпълнява, ако не е добавен 1 в ArrayList (от тип String)? Ако да, тогава защо е разрешено?

Отговори:

15 за отговор № 1

Използвали сте изтриване на типа, което означава, че сте игнорирали предварително зададени общи проверки. Можете да се измъкнете от това, тъй като това, тъй като генеричните файлове са функция за време за компилиране, която не е проверена по време на изпълнение.

Какво имате като

List list = new ArrayList() ;
list.add(1) ;
Integer hello = (Integer) list.get(0) ;
System.out.println(hello);

или

List<Integer> list = new ArrayList<Integer>() ;
list.add(1) ;
Integer hello = list.get(0); // generics add an implicit cast here
System.out.println(hello);

Ако погледнете байтовия код, генериран от компилатора, няма начин да се каже разликата.

Интересното е, че можете да направите това

List<String> strings = new ArrayList<String>();
@SuppressWarnings("unchecked");
List<Integer> ints = (List) strings;
ints.add(1);

System.out.println(strings); // ok
String s= strings.get(0); // throws a ClassCastException

12 за отговор № 2

Проблемът е, че вашият list променливата има суров тип и можете да добавите обекти от всякакъв тип към този списък. За да разрешите проблема, просто го декларирайте като List на String"с:

List<String> list = new ArrayList<String>() ;

3 за отговор № 3

Събира се, защото декларацията List list използва суровия тип List, а не свързан тип List<String>, Вторият ред се компилира, защото вашият list променлива може да приеме всичко. Третият ред компилира, защото list.get(0) се завръща Object, Четвъртият ред няма причина да се провали.

Случайно нищо в компилирания код не е довело до прехвърляне на цяло число 1 към a String, Но не трябва да зависи от това. Дали първият ред беше подходящият

List<String> list = new ArrayList<>();

грешката ви щеше да бъде уловена по време на компилиране.


3 за отговор № 4

Когато декларирате списък като този: List list = new ArrayList<String>() ;

Използвате това, което се нарича Raw Type. Това е тип, който има общ параметър тип, като List, но не успяхте да го предоставите. Ако проверите предупрежденията на компилатора, ще видите, че той ви казва за това. Смесването на параметризирани типове със сурови типове обикновено се счита за грешка в програмирането. Това е добре:

List<String> list = new ArrayList<String>() ;

и това е наред (но остаряло):

List list = new ArrayList();

Но начинът, по който сте го написали, трябва да се избягва.

Проблемът е, че генеричните материали се проверяват само по време на компилация и вие сте казали на компилатора List, не List<String>, така че ще ви позволи да поставите там всичко, което искате! Фактът, че дясната страна има параметър, наистина не означава нищо, това е типът на реалната референция, която има значение за компилатора.


0 за отговор № 5
List list = new ArrayList<String>() ; // WARNING!!!

Опасен списък се отнася до безопасен ArrayList

list.add(1) ;  // WARNING!!!

Integer (int 1, превърнат в Integer е Autoboxing), не е добавен String в списъка

Integer hello = (Integer) list.get(0) ;

Кастингът е задължителен, защото опасният списък може да съдържа всичко.

System.out.println(hello);

Integer.toString () се извиква

Когато се изпълнява ред list.add (1), не е ли добавен 1 към ArrayList (от тип String)?

Да. Integer беше добавен към ArrayList, който трябва да съдържа String.

Ако да, тогава защо е разрешено това?

Обратна съвместимост. Java трябва да поддържа предгенерични кодове.

Списък списък; означава, че е опасно, така че можете да направите всичко с него и посоченият ArrayList () трябва да толерира това.

Поука: Не пренебрегвайте предупрежденията на компилатора, в противен случай Integer може да влезе в ArrayList, който трябва да съдържа Strings.


-1 за отговор № 6

Да ... 1 е добавен към Array, тъй като Java, подобно на други езици, осъществява имплицитно (автоматично) преобразуване (кастинг) на примитивни типове данни.

Повече информация тук Реализации и промоции


-3 за отговор № 7

Опитайте тази

List.add(Integer.toString(1));

Можете също да опитате това

List list = new ArrayList<Object>() ;

Ако не е необходимо, arraylist трябва да бъде Arraylist of String


-4 за отговор № 8

Не, защото Java вижда 1 като цяло число. Ще трябва първо да конвертирате номера си като String Integer.toString(n)