【问题标题】:Java how to cast a whole List [duplicate]Java如何投射整个列表[重复]
【发布时间】:2016-09-17 19:26:00
【问题描述】:

在 Java 中如何在不迭代的情况下转换完整的列表。 我有这个功能:

private List<Object> getItems (List<Object> list, Pagination pagination) {

        if (list.size() > pagination.getItemsXPage()) {

            int init = (pagination.getCurrentPage()-1)* pagination.getItemsXPage();
            int end =  init +  pagination.getItemsXPage();

            if (end > list.size()) {
                end = list.size();
            }

            return list.subList(init, end);

        } else {

            return list;                        
        }       

    }

我想这样做,但不可能?

List<ApplicationSearchItem> applicationSearchItem = (List) getItems (list, searchCriteria.getCategoryProductsPagination()); 

【问题讨论】:

  • 简短回答:你不能。长答案:创建一个新的 List&lt;ApplicationSearchItem&gt; 并通过强制转换一个一个地复制每个元素。见this question

标签: java


【解决方案1】:

在这种情况下,您将使用泛型方法声明:

到现在为止,您将学会避免初学者尝试使用 Collection 作为集合参数的类型的错误。您可能已经或可能没有意识到使用 Collection 也不行。回想一下,您不能只将对象塞入未知类型的集合中。

from oracle generic methods tutorial

返回类型由参数列表的类型定义:

private <T> List<T> getItems (List<T> list, Pagination pagination) {
 ... 
}

【讨论】:

  • 不相关,但由于该方法不使用任何字段,所以应该也是static
【解决方案2】:

使用您当前的代码,您要么必须单独转换每个对象,要么将方法的参数从 List&lt;Object&gt; 更改为 List&lt;ApplicationSearchItem&gt;,以避免使用转换。

您不能简单地转换整个列表的原因是因为列表只是一个引用持有者;实际列表仅指向对象类型,并确保列表中只有正确类型的对象。在内存本身中,对象仍然独立于列表而存在,因此无论哪种方式,它们都将被单独转换以转换它们的类型。

按照 dok 所说的(其他答案),您的方法可以接受任何类型的对象并对其进行操作。或者,您可以让它只接受您不需要进行强制转换的列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-19
    相关资源
    最近更新 更多