Как использовать List to List

Это не компилируется, любое предложение оценивается.

... List list = getList(); return (List) list; 

Компилятор говорит: не может использовать List to List

вы всегда можете применить любой объект к любому типу, перенесив его в Object сначала. в твоем случае:

 (List)(Object)list; 

вы должны быть уверены, что во время выполнения список не содержит ничего, кроме объектов Customer.

Критики говорят, что такое кастинг указывает на что-то не так с вашим кодом; вы должны уметь настраивать объявления типа, чтобы избежать этого. Но дженерики Java слишком сложны, и это не идеально. Иногда вы просто не знаете, есть ли удовлетворительное решение для компилятора, даже если вы хорошо знаете типы времени выполнения и знаете, что вы пытаетесь сделать, это безопасно. В этом случае просто выполняйте грубое литье по мере необходимости, чтобы вы могли оставить работу на дому.

Это потому, что, хотя Клиент является объектом, список клиентов не является списком объектов. Если бы это было так, вы могли бы поместить любой объект в список Клиентов.

В зависимости от вашего другого кода лучший ответ может отличаться. Пытаться:

 List list = getList(); return (List) list; 

или

 List list = getList(); return (List) list; 

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

Вы можете использовать двойной бросок.

 return (List) (List) getList(); 

С streamами Java 8:

Иногда отличная отливка отличная:

 List mythings = (List) (Object) objects 

Но вот более универсальное решение:

 List objects = Arrays.asList("String1", "String2"); List strings = list.stream() .map(element->(String) element) .collect(Collectors.toList()); 

Есть много преимуществ, но один из них заключается в том, что вы можете сделать свой список более элегантным, если не можете быть уверены, что он содержит:

 list.stream() .filter(element->element instanceof String) .map(element->(String)element) .collect(Collectors.toList()); 

Обратите внимание: я не программист на Java, но в .NET и C # эта функция называется контравариацией или ковариацией. Я еще не углубился в эти вещи, так как они новы в .NET 4.0, которые я не использую, так как это только бета-версия, поэтому я не знаю, какой из двух терминов описывает вашу проблему, но позвольте мне описать техническая проблема с этим.

Предположим, вам разрешили бросить. Заметьте, я говорю cast , так как это то, что вы сказали, но есть две операции, которые могут быть возможны, кастинг и преобразование .

Преобразование означало бы, что вы получаете новый объект списка, но вы говорите о кастинге, что означает, что вы хотите временно рассматривать один объект как другой тип.

Вот в чем проблема.

Что произойдет, если будет разрешено следующее (обратите внимание, что я предполагаю, что перед списком список объектов фактически содержит объекты клиента, в противном случае приведение не будет работать даже в этой гипотетической версии java):

 List list = getList(); List customers = (List)list; list.Insert(0, new someOtherObjectNotACustomer()); Customer c = customers[0]; 

В этом случае это попытается обработать объект, который не является клиентом, как клиент, и вы получите ошибку времени выполнения в одной точке, либо в форме внутри списка, либо из назначения.

Однако генераторы должны предоставлять вам типы данных типа типа, такие как коллекции, и, поскольку они любят бросать слово «гарантировано», этот тип приведения, с последующими проблемами, не допускается.

В .NET 4.0 (я знаю, ваш вопрос касался java), это будет разрешено в некоторых очень конкретных случаях , когда компилятор может гарантировать, что операции, которые вы делаете, безопасны, но в общем смысле этот тип приведения не будет допустимо. То же самое справедливо и для java, хотя я не уверен в каких-либо планах по внедрению совместной и контравариантности в Java-язык.

Надеюсь, кто-то с более высоким знанием java, чем я, может рассказать вам о специфике будущего java или реализации.

Вы должны просто перебирать список и бросать все объекты по одному

Вы не можете, потому что List и List не находятся в одном дереве наследования.

Вы можете добавить новый конструктор в свой class List который принимает List а затем перебирает список, в котором каждый Object к Customer и добавляет его в вашу коллекцию. Имейте в виду, что может произойти недопустимое исключение листинга, если в списке List вызывающего есть что-то, что не является Customer .

Пункт общих списков состоит в том, чтобы ограничить их определенными типами. Вы пытаетесь взять список, который может иметь что-нибудь в нем (Заказы, Продукты и т. Д.) И сжать его в список, который может принимать только клиенты.

Лучше всего создать новый List , выполнить итерацию через List , добавить каждый элемент в новый список и вернуть его.

Как указывали другие, вы не можете их применять, поскольку List не является List . Что вы можете сделать, это определить представление в списке, который выполняет проверку типа на месте. Использование Коллекций Google , которые будут:

 return Lists.transform(list, new Function() { public Customer apply(Object from) { if (from instanceof Customer) { return (Customer)from; } return null; // or throw an exception, or do something else that makes sense. } }); 

В зависимости от того, что вы хотите сделать с этим списком, вам может даже не понадобиться передавать его в List . Если вы хотите добавить объекты Customer в список, вы можете объявить его следующим образом:

 ... List list = getList(); return (List) list; 

Это законно (ну, не только юридический, но правильный – список имеет «некоторый супертип для Клиента»), и если вы собираетесь передать его в метод, который будет просто добавлять объекты в список, то выше для этого достаточно общих границ.

С другой стороны, если вы хотите извлекать объекты из списка и набирать их строго как клиенты – тогда вам не повезло, и это правильно. Поскольку список представляет собой List нет никакой гарантии, что содержимое является клиентом, поэтому вам придется предоставить свое собственное кастинг при поиске. (Или быть действительно, абсолютно, вдвойне уверен, что список будет содержать только Customers и использовать двойное нажатие из одного из других ответов, но поймите, что вы полностью обходите безопасность типа компиляции, которую вы получаете от дженериков в Это дело).

Вообще говоря, всегда полезно рассмотреть максимально возможные общие границы, которые были бы приемлемы при написании метода, вдвойне, если он будет использоваться в качестве библиотечного метода. Если вы собираетесь читать только из списка, используйте List List вместо List , например, это дает вашим абонентам гораздо больше возможностей в аргументах, которые они могут передать, и означает, что они с меньшей вероятностью столкнутся с предотвратимыми проблемами, аналогичными тем, которые у вас здесь есть.

Вы можете сделать что-то подобное

 List cusList = new ArrayList(); for(Object o: list){ cusList.add((Customer)o); } return cusList; 

Или способ Java 8

 list.stream().forEach(x->cusList.add((Customer)x)) return cuslist; 

Подобно Божо выше. Вы можете сделать некоторое обходное решение здесь (хотя мне это не нравится) с помощью этого метода:

 public  List convert(List list, T t){ return list; } 

Да. Он перечислит ваш список в ваш требуемый общий тип.

В данном случае вы можете сделать следующий код:

  List list = getList(); return convert(list, new Customer()); 

Другим подходом будет использование streamа java 8.

  List customer = myObjects.stream() .filter(Customer.class::isInstance) .map(Customer.class::cast) .collect(toList()); 

Вы можете создать новый список и добавить к нему элементы:

Например:

 List a = getListOfA(); List newList = new ArrayList<>(); newList.addAll(a); 
  • Как увидеть JIT-скомпилированный код в JVM?
  • Как вы очищаете буферный файл log4j FileAppender?
  • Получает последнюю цифру числа
  • Можете ли вы настроить Windows на открытие файлов JAR, таких как ZIP-файлы, без стороннего инструмента?
  • Gson: Есть ли более простой способ сериализации карты
  • Очистите ArrayList или просто создайте новый, и пусть старый будет собран мусором?
  • ArrayList vs. Vectors в Java, если безопасность streamов не является проблемой
  • Когда можно использовать обработку исключений для бизнес-логики?
  • Быстрый и простой способ объединения элементов массива с разделителем (противоположность split) в Java
  • javac для компиляции всех java-файлов в данной директории рекурсивно
  • JavaFX Beans Binding внезапно перестает работать
  • Давайте будем гением компьютера.