Arrays.asList: когда набор используется в качестве аргумента, мы возвращаем список вместо List <Integer> - PullRequest
5 голосов
/ 07 мая 2020
Set<Integer> iset = new HashSet<>();
iset.add(1);
List<Integer> ilist =  Arrays.asList(iset);

Мое намерение состояло в том, чтобы преобразовать набор целых чисел в список целых чисел, но компилятор жалуется, что List> не может быть преобразован в список. Почему asList работает именно так и когда его можно использовать? Как правильно преобразовать набор в список?

Ответы [ 3 ]

10 голосов
/ 07 мая 2020

Потому что Arrays.asList обрабатывает iset только как один элемент. Вот почему это создает List<Set<Integer>>.

Чтобы составить список элементов в наборе, передайте набор конструктору списка.

List<Integer> ilist = new ArrayList<Integer>(iset);

Различные варианты использования Arrays.asList:

List<Integer> ilist1 = Arrays.asList(1); // Single element
List<Integer> ilist2 = Arrays.asList(1,2,3); // Multiple element
Integer a[] = new Integer[] { 10, 20, 30, 40 }; 
List<Integer> ilist3 = Arrays.asList(a); // Array 
1 голос
/ 07 мая 2020

Надеюсь, следующий пример поможет вам понять, почему это происходит.

import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.HashSet;

public class practice {

    public static void main(String... string) {


        /**
         *  This will return a list of Integer, because if we see the implementation of Arrays.asList() 
         *  then this all puzzle will be solved.
         *  Arrays can process a Array collection of data.
         *  asList is generic implementation, returned object data type will be same as received dataType                     
         */
        Integer a[] = new Integer[] {1, 2, 3, 4};
        List<Integer> arrList =  Arrays.asList(a);


        /**
         * But in this case, Arrays.asList() is receiving a collection of Integer object and asList will try to return the 
         * same type of data as it received.
         * So it received Set and will return set 
         * and for more investigation apply debug points in ArrayList class under java.util.Arrays.ArrayList  
         */
        Set<Integer> iset = new HashSet<>();
        iset.add(1);
        List<Set<Integer>> ilist =  Arrays.asList(iset);

    }

}
0 голосов
/ 07 мая 2020

Arrays.asList получает аргумент varargs , который представляет собой скрытый массив.

Он просто возвращает List объект, содержащий элементы аргумента массива.

Итак, если вы это сделаете:

List<Integer> numbers = Arrays.asList(1, 2, 3);

, вы получите List<Integer>, содержащий [1, 2, 3].

Если у вас есть этот generi c class:

class MyObject<T> { }

И выполните:

MyObject<String> myStrObj1 = new MyObject<>();
MyObject<String> myStrObj2 = new MyObject<>();

List<MyObject<String>> myStrObjects = Arrays.asList(myStrObj1, myStrObj2);

Вы получите List<MyObject<String>>, содержащий [myStrObj1, myStrObj2].

То же самое происходит, когда вы передаете некоторые экземпляры Set<Integer> в Arrays.asList :

Set<Integer> integerSet1 = new HashSet<>();
integerSet1.add(1);

Set<Integer> integerSet2 = new HashSet<>();
integerSet2.add(5);
integerSet2.add(6);

List<Set<Integer>> integerSets =  Arrays.asList(integerSet1, integerSet2);

Вы получите List<Set<Integers>>, содержащий [[1], [5, 6]].


Если вы просто хотите создать новый объект List с теми же элементами, что и Set объект, вы должны повторить набор и добавить каждый из его элементов в список:

Set<Integer> set = new HashSet<>();
set.add(1);
set.add(2);
set.add(3);

List<Integer> list = new ArrayList<>();

for (Integer element : set) {
    list.add(element);
}

К счастью, конструктор ArrayList сделает именно это за вас. Итак, все, что вам нужно сделать, это:

Set<Integer> set = new HashSet<>();
set.add(1);
set.add(2);
set.add(3);

List<Integer> list = new ArrayList<>(set);
...