Прежде всего, я могу только согласиться с тем, что Arrays.asList(T...)
это однозначно лучшее решение для типов или массивов Wrapper с не примитивными типами данных. Этот метод вызывает конструктор простой частной статической AbstractList
реализации в Arrays
классе, который в основном сохраняет заданную ссылку на массив как поле и моделирует список, переопределяя необходимые методы.
Если вы можете выбирать между типом примитива или типом Wrapper для вашего массива, я бы использовал тип Wrapper для таких ситуаций, но, конечно, это не всегда полезно или необходимо. Вы можете сделать только две возможности:
1) Вы можете создать класс со статическим методом для каждого массива примитивных типов данных ( boolean, byte, short, int, long, char, float, double
возвращая Iterable<
WrapperType >
. Эти методы будут использовать анонимные классы Iterator
(кромеIterable
), которые могут содержать ссылку на аргумент включающего метода (например, an int[]
) в качестве поля для реализации методов.
-> Этот подход является быстродействующим и экономит вашу память (за исключением памяти вновь созданных методов, несмотря на то, что использование использовало Arrays.asList()
бы память таким же образом)
2) Поскольку у массивов нет методов (для чтения на стороне вы связались) они также не могут предоставить Iterator
экземпляр. Если вам действительно лень писать новые классы, вы должны использовать экземпляр уже существующего класса, который реализует, Iterable
потому что нет другого пути, чем создание экземпляров Iterable
или подтип.
ЕДИНСТВЕННЫЙ способ создания существующей коллекции производной реализацииIterable
должен использовать цикл (за исключением того, что вы используете анонимные классы, как описано выше) или вы создаете экземпляр Iterable
реализующего класса, конструктор которого допускает массив примитивного типа (потому Object[]
что не допускает массивы с элементами примитивного типа), но, насколько я знаю, Java API не имеет такого класса.
Причина цикла может быть легко объяснена:
для каждой Коллекции вам нужны Объекты, а первичные типы данных не являются объектами. Объекты намного больше, чем примитивные типы, поэтому им требуются дополнительные данные, которые должны быть сгенерированы для каждого элемента массива примитивных типов. Это означает, что если два способа из трех (использование Arrays.asList(T...)
или использование существующей коллекции) требуют совокупности объектов, вам необходимо создать для каждого примитивного значения вашегоint[]
массив объекта обертки. Третий способ - использовать массив как есть и использовать его в анонимном классе, так как я думаю, что он предпочтительнее из-за высокой производительности.
Существует также третья стратегия, использующая Object
аргумент as для метода, в котором вы хотите использовать массив, или Iterable
требующая проверки типов, чтобы выяснить, какой тип имеет аргумент, однако я бы не рекомендовал его вообще, поскольку вам обычно требуется Учтите, что объект не всегда имеет требуемый тип, и вам нужен отдельный код для определенных случаев.
В заключение, это вина проблематичной системы Generic Type, которая не позволяет использовать примитивные типы в качестве универсального типа, что позволило бы сэкономить много кода, просто используяArrays.asList(T...)
, Таким образом, вам нужно запрограммировать для каждого массива примитивного типа, вам нужен такой метод (который в принципе не имеет значения для памяти, используемой программой C ++, которая создаст для каждого используемого аргумента типа отдельный метод).