Java. Является ли новый стек‹?›[N] эквивалентным новому стеку[N] для универсального типа данных Stack‹Item›?

Является ли new Stack<?>[N] эквивалентом new Stack[N] для общего типа данных Stack<Item>?

РЕДАКТИРОВАТЬ: хотя я понимаю, что лучше избегать смешивания универсальных типов и массивов и что существуют более надежные решения, мой вопрос остается в силе: широко признанные учебники, такие как Алгоритмы, 4-е издание Кевина Уэйна и Роберта Седжвика ( стр. 158) предлагают использовать такие конструкции:

Stack<String>[] a = (Stack<String>[]) new Stack[N];

person Fabian    schedule 23.03.2015    source источник
comment
Быстрый неответ: не делайте этого. Обобщения и массивы не должны использоваться вместе. См. docs.oracle.com/javase/tutorial/java/generics. /   -  person GhostCat    schedule 23.03.2015
comment
@EddyG, я надеялся создать стек строк с помощью следующего кода: Stack‹String›[] a = (Stack‹String›[]) new Stack[N]; Он выдает предупреждение, но всегда ли это считается плохой практикой?   -  person Fabian    schedule 23.03.2015
comment
Опять таки; все, что вам нужно знать, находится в документации от Oracle. Вместо использования массивов просто используйте типы коллекций, такие как ArrayList. Затем легко создать ArrayList‹Stack‹String››   -  person GhostCat    schedule 23.03.2015
comment
Хорошо, я посмотрю на это спасибо!   -  person Fabian    schedule 23.03.2015


Ответы (2)


Да, они эквивалентны, за исключением типа возврата (один Stack[], другой Stack<?>[]).

Обратите внимание, что Stack[] можно присвоить Stack<String>[] без явного приведения (вы просто получите предупреждение о непроверенном преобразовании), тогда как назначение Stack<?>[] Stack<String>[] без приведения является ошибкой.

new Stack[N] использует необработанный тип, который не рекомендуется в новом коде.

person newacct    schedule 23.03.2015
comment
Нет, они не эквивалентны. Первая не является легальной Java и не будет компилироваться. Второй есть и будет. - person user207421; 24.03.2015
comment
@EJP: это абсолютно действительная Java. - person newacct; 24.03.2015
comment
@EJP, вы неправы. Я предлагаю вам удалить свой комментарий. - person aioobe; 30.03.2015

[ Превращая мой комментарий в реальный ответ ]

1) Следует избегать смешивания массивов и универсальных типов.

2) Вместо этого можно использовать типы Java Collection, например ArrayList, когда возникает необходимость обрабатывать несколько «общих» объектов, например, в

ArrayList<Stack<String>> theStacks = new ArrayList<>();
person GhostCat    schedule 23.03.2015