Создание нового ArrayList

У меня есть вопрос о создании нового списка массивов.

Если я создам новый, с

ArrayList <?> listtwo = new ArrayList<?>();

Что я могу поместить в массив? Могу ли я поместить в него строки и целые числа? Или как это работает.

Я знаю, что если вы создадите список, например:

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

что в него можно поместить только Strings. и если вы попытаетесь сделать что-то еще, это даст исключение компиляции.


person user3807485    schedule 05.07.2014    source источник
comment
вы можете просто поместить строковые значения в ArrayList‹String›, и если вы хотите поместить другие значения, вы должны преобразовать их в строку!   -  person Mohsen fallahi    schedule 05.07.2014
comment
Я знаю, что вы можете в ArrayList‹string›, но мой вопрос: что я могу поместить в Arraylist‹?›   -  person user3807485    schedule 05.07.2014
comment
List<?> как интерфейс в значительной степени соответствует границам List<? extends Object>. На самом деле не сильно ограничивает.   -  person EpicPandaForce    schedule 05.07.2014
comment
Я разместил некоторую информацию об дженериках здесь: и приведение к примитивному типу"> stackoverflow.com/questions/24574478/   -  person EpicPandaForce    schedule 05.07.2014


Ответы (2)


Здесь есть две проблемы.

(a) new ArrayList<?> не является допустимым выражением.

Если вы хотите создать список, который может содержать строки и целые числа, вам нужно использовать ArrayList<Object>, поскольку Object является (наиболее конкретным) распространенным супертипом String и Integer:

ArrayList<Object> list = new ArrayList<Object>;
list.add('abcd'); // insert a string
list.add(1234); // insert an integer

Недостатком является то, что когда вы извлекаете элемент из этого списка, он будет иметь тип Object, поэтому вам нужно будет его преобразовать:

String s = (String) list.get(0);
Integer n = (Integet) list.get(1);

(b) Что касается подстановочного знака ?:

Его можно использовать для указания типа переменной, например: ArrayList<?> list = ..., но его нельзя использовать в выражении new. Другими словами, это выражение недопустимо: new ArrayList<?>.

Подстановочный знак полезен для разрешения (ограниченного) полиморфизма между списками. В частности, если у вас есть список Integer и вы хотите рассматривать его как список Number (что имеет смысл, поскольку Integer является подклассом Number), вы можете использовать подстановочный знак.

ArrayList<Integer> list2 = new ArrayList<Integer>();
list2.add(100);
list2.add(200);

// This assignment is OK:
ArrayList<? extends Number> list3 = list2;   
Number n = list3.get(0); // n is now 100

Однако проблема со списком3 (или любым другим списком с подстановочным знаком) заключается в том, что вы не можете изменить его. Например, если вы попытаетесь добавить элемент в этот список:

list3.add(300); // <-- This is not allowed

вы получите ошибку времени компиляции.

person Itay Maman    schedule 05.07.2014

Если я создам новый, с

ArrayList <?> listtwo = new ArrayList<?>();

Вы не можете. Вы не можете создать экземпляр параметризованного типа без ограничений. Вот что скажет компилятор:

      ArrayList <?> listtwo = new ArrayList<?>();
                                           ^
  required: class or interface without bounds
  found:    ?

Так что вопрос, что туда можно поставить, спорный.

Если вы вообще не указали параметр типа:

ArrayList listtwo = new ArrayList();

... вы можете положить в него все, что вам нравится (включая смесь вещей). Примитивные значения будут приведены к эквивалентам их объектов (int => Integer и т. д.). На данный момент это в основном экземпляр ArrayList<Object>.

person T.J. Crowder    schedule 05.07.2014
comment
Спасибо, я был смущен этим! - person user3807485; 05.07.2014