2016-05-08 4 views
1

В Эффективная Java J. Bloch упомянул, что использовать метод varargs с примитивными типами было небезопасно. Напротив, у Arrays.asList(1, 2, 4) был тип возврата List<int[]>, и это звучит довольно разумно. Теперь я попытался воспроизвести это поведение себя и не мог:Методы Varargs и примитивные типы

enter image description here

Мой вопрос почему тип выводится на List<Integer> но не List<int[]>, как он сказал? Означает ли это, что в Java 8 проблема с varargs больше не имеет отношения к делу, и мы можем безопасно использовать их в любом месте, если мы не слишком сильно заботимся о производительности.

ответ

4

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

int[] intArray = {1,2,3}; 
Arrays.asList(intArray); 

, который будет возвращать List<int[]> не List<Integer>, поскольку нет Autoboxing массивов как int[]->Integer[] так только возможный тип, который может быть использован T... vararg is int[], поскольку общий тип T не может представлять примитивный тип.


Другая возможная проблема в том, что вы читаете первое издание книги (выпущен в 2001 году), но Autoboxing был добавлен в Java 1.5 (Java 5.0), который был выпущен в 2004 году

+0

Но добавляют переменные аргументы в Java 1.5 тоже, поэтому, если в книге упоминаются varargs, она должна быть Java 5+. – newacct

Смежные вопросы