Что здесь пошло не так?

    String st = "String";
    char[] chArr = st.toCharArray();
    System.out.println(Arrays.toString(chArr));

    // Converting array to list
    List<Character> stArrList = Arrays.asList(chArr); //Throwing error

    // String array
    String[] stringArr = { "S", "t", "r", "i", "n", "g" };
    // Converting String array to list
    List<String> stringList = Arrays.asList(stringArr);

При попытке конвертировать String [] в List<String> с использованием asList, это работает. Но для char [] to List<Character> не работает.

Киньте ниже ошибки: Несоответствие типов: невозможно преобразовать из List<char[]> в List<Character>

3
Viveksuriyan 26 Ноя 2019 в 09:30
Собственно, что ты пытаешься сделать?
 – 
Prasad
26 Ноя 2019 в 09:33
Попытка преобразовать массив в список @Prasad
 – 
Viveksuriyan
26 Ноя 2019 в 09:34
Собственные типы не являются объектами, и к ним применяются особые правила.
 – 
Thorbjørn Ravn Andersen
26 Ноя 2019 в 09:34
Но почему его можно преобразовать как List ?
 – 
Viveksuriyan
26 Ноя 2019 в 09:35
Ваше понимание того, как Arrays.asList () работает при вызове, неверно. Он возвращает список заданных аргументов, а не преобразует массив в список.
 – 
Thorbjørn Ravn Andersen
26 Ноя 2019 в 09:41

5 ответов

Если вы посмотрите на реализацию Arrays # asList, она реализована так:

/**
 * Returns a fixed-size list backed by the specified array.  (Changes to
 * the returned list "write through" to the array.)  This method acts
 * as bridge between array-based and collection-based APIs, in
 * combination with {@link Collection#toArray}.  The returned list is
 * serializable and implements {@link RandomAccess}.
 *
 * <p>This method also provides a convenient way to create a fixed-size
 * list initialized to contain several elements:
 * <pre>
 *     List&lt;String&gt; stooges = Arrays.asList("Larry", "Moe", "Curly");
 * </pre>
 *
 * @param <T> the class of the objects in the array
 * @param a the array by which the list will be backed
 * @return a list view of the specified array
 */
@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
    return new ArrayList<>(a);
}

Важно отметить, что он ожидает элементы типа T, где

T - это класс объектов в массиве

Причина, по которой работает String [], заключается в том, что это массив объектов, а char [] - массив примитивов.

2
EmberTraveller 26 Ноя 2019 в 09:44
Спасибо. Это ответило на мой вопрос @EmberTraveller
 – 
Viveksuriyan
26 Ноя 2019 в 11:55

Ты можешь сделать,

st.chars().mapToObj(c -> (char) c).collect(Collectors.toList());
0
Vikas Yadav 26 Ноя 2019 в 09:34

С Java 8 можно с одним вкладышем

List<Character> stArrList = st.chars().mapToObj(c -> (char) c).collect(Collectors.toList());

Мы также можем использовать IntStream.range () для прямого доступа к каждому символу и добавления его в список, как показано ниже:

        String string = "Dinesh";

        List<Character> chars = new ArrayList<>();
        IntStream.range(0, string.length())
                .forEach(index -> chars.add(string.charAt(index)));
0
Dinesh Kondapaneni 26 Ноя 2019 в 09:35
List<Character> stArrList = new ArrayList<Character>();
for (char c : chArr) {
        stArrList.add(c);
    }
1
Suns 26 Ноя 2019 в 09:36
Я знаю этот способ реализации. Но мой вопрос был в том, почему это не работает. Спасибо, в любом случае
 – 
Viveksuriyan
26 Ноя 2019 в 11:51

Попробуй это:

    `String st = "String";
     String[] stringArr = st.split("");
     List<String> stringList = Arrays.asList(stringArr);
     int i=0;

     for (String c : stringList) {
            System.out.println(c);
        }`
0
Jaha 26 Ноя 2019 в 09:35