Как бросить Список <Объект> Перечислить <MyClass>

Это не компилирует, никакое ценившее предложение.

 ...
  List<Object> list = getList();
  return (List<Customer>) list;

В компиляторе говорится: не может бросить List<Object> к List<Customer>

88
задан skaffman 18 December 2009 в 06:31
поделиться

11 ответов

As others have pointed out, you cannot savely cast them, since a List isn't a List. What you could do, is to define a view on the list that does in-place type checking. Using Google Collections that would be:

return Lists.transform(list, new Function<Object, Customer>() {
  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.
  }
});
1
ответ дан 24 November 2019 в 07:25
поделиться

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

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

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

2
ответ дан 24 November 2019 в 07:25
поделиться

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

(List<Customer>)(Object)list; 

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

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

142
ответ дан 24 November 2019 в 07:25
поделиться

Аналогично Божо выше. Здесь вы можете найти обходной путь (хотя мне это не нравится) с помощью этого метода:

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

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

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

    List<Object> list = getList();
    return convert(list, new Customer());
0
ответ дан 24 November 2019 в 07:25
поделиться

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

1
ответ дан 24 November 2019 в 07:25
поделиться

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

3
ответ дан 24 November 2019 в 07:25
поделиться

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

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

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

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

Что бы произошло, если бы было разрешено следующее (обратите внимание, я '

8
ответ дан 24 November 2019 в 07:25
поделиться

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

return (List<Customer>) (List) getList();
21
ответ дан 24 November 2019 в 07:25
поделиться

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

List<? extends Object> list = getList();
return (List<Customer>) list;

или

List list = getList();
return (List<Customer>) list;

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

32
ответ дан 24 November 2019 в 07:25
поделиться

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

36
ответ дан 24 November 2019 в 07:25
поделиться

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

...
List<Object> list = getList();
return (List<? super Customer>) list;

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

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

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

1
ответ дан 24 November 2019 в 07:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: