2013-05-13 2 views
1

Когда я хочу, чтобы бросить ArrayList объект в List ссылки, которые вернулись из метода:список броска к ArrayList

public static <T> List<T> asList(T... a) { 
    return new ArrayList<>(a); 
} 

Тип возвращаемого из метода asList является List ссылка на ArrayList объект а, значит, я могу бросить его на ArrayList ссылка. такой, что:

String[] colors = { "black", "blue", "yellow" }; 
ArrayList<String> links = (ArrayList<String>) Arrays.asList(colors) ; 

Но этот код сделал во время выполнения ошибки:

Исключение в потоке "главный" java.lang.ClassCastException: java.util.Arrays $ ArrayList не может быть приведен к java.util.ArrayList

Почему это произошло?

+0

ArrayList, который возвращается из Arrays.asList, не является фактическим arraylist, это всего лишь оболочка ..., которая не позволяет вносить изменения в список –

+0

, что вы имеете в виду "wrapper" ?? – Aladdin

ответ

4

Ваше предположение о том, что вы можете передать его в ArrayList, недействительно.

ArrayList - это бетонный тип, который реализует интерфейс List. Не гарантируется, что метод asList, вернет этот тип реализации.

Фактически используемый тип java.util.Arrays$ArrayList.

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

Но API должен раскрываться наиболее абстрактным образом. Вот почему был использован List.

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