2013-03-19 4 views
2

У меня есть метод, чтобы преобразовать массив с ArrayList следующим образом:Общий метод для преобразования массива в ArrayList

public static <T> ArrayList<T> getArrayList(T[] a){ 
     ArrayList<T> retList = new ArrayList<T>(); 
     for (T i : a){ 
      retList.add(i); 
     } 
     return retList; 
    } 

, который прекрасно работает для массивов объектов, таких как:

String[] arr = {"String","'nother string","etc"}; 
    ArrayList<String> stringList = initArrayList(arr); 

Но не примитивные массивы:

int[] arr2 = {1,2,3}; 
    ArrayList<Integer> intList = initArrayList(arr2); //Compiler is insulted by this. 

Я предполагаю, что я должен преобразовать массив в массив Integer, если я хочу, чтобы метод работы , но есть ли способ сделать метод немного более умным в том, как он справляется с этим?

Java-учебники сайт имеет следующее:

static <T> void fromArrayToCollection(T[] a, Collection<T> c) { 
     for (T o : a) { 
      c.add(o); // Correct 
     } 
    } 

Который будет работать, но я хотел бы метод, который будет создавать ArrayList.

Кроме того, это только для моего собственного развлечения, поэтому тип коллекции действительно не имеет значения, я просто использовал ArrayList, когда написал метод.

Благодаря

+0

Нет, на самом деле нет. Примитивные массивы и дженерики не собираются смешиваться. –

+1

Посмотрите на это http://stackoverflow.com/questions/754294/convert-an-array-of-primitive-longs-into-a-list-of-longs –

ответ

2

Существует не общий метод, который может работать с примитивами, поскольку примитивы не могут быть родовым типом. Ближе вы могли бы прийти в чистом Java является перегружать getArrayList с int[] ...

public static ArrayList<Integer> getArrayList(int[] a){ 
    ArrayList<Integer> retList = new ArrayList<Integer>(); 
    for (int i : a){ 
     retList.add(i); 
    } 
    return retList; 
} 

, который будет боксировать ваш int для вас. Это не общее, и вам понадобится новая перегрузка для каждого типа примитивных массивов, но это самое близкое решение, о котором я могу думать.

+0

Было ощущение, что это может быть так. Кинда сосет, но хорошо. Благодарю. – Kraiden

+0

+1 и обратите внимание, что вы могли бы потребовать «int ...» для обеспечения масштабируемости и инициализации емкости с помощью 'new ArrayList (a.length)'. –

1

Есть готовые к использованию методов java.util.Arrays.asList и com.google.common.primitives.Ints.asList.

+1

'Arrays.asList' возвращает' List' , а не 'ArrayList'. Кроме того, даже если 'List list = Arrays.asList (1, 2, 3);' компилирует ', список list = Arrays.asList (новый int [] {1, 2, 3}); 'не компилируется , С аргументом массива компилятор будет считать, что возвращаемый тип является «List ». – rgettman

+0

@ rgettman прав. Только 'Ints.asList' Guava будет работать правильно. См. Мой ответ [здесь] (http://stackoverflow.com/questions/10676185/what-is-wrong-here-i-get-a-java-lang-classcastexception-error-but-i-cant-see-w/10676223 # 10676223). –

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