【问题标题】:Convert ArrayList<String> to java.util.List [closed]将 ArrayList<String> 转换为 java.util.List [关闭]
【发布时间】:2013-04-23 20:14:25
【问题描述】:

我很难理解一个概念。我正在尝试将ArrayList&lt;String&gt; 转换为List(或List&lt;String&gt;),但我一直遇到强制转换异常。是的,我看到了将字符串数组转换为列表的代码,但我觉得这是一个不同的场景。我的相关代码在这里,请注意声明是因为我正在使用 GWT,因此必须将一些东西声明为静态和最终...

private static List<String> values;
Ioma.dataservice.getPendingOrders(new AsyncCallback<ArrayList<Order>>(){
    @Override
    public void onFailure(Throwable caught) {
        // TODO Auto-generated method stub
    }
    @Override
    public void onSuccess(ArrayList<Order> result) {
        ArrayList<String> orderNumbers = new ArrayList<String>();               
        //problem here, cannot cast arraylist<string> to list string for some reason? idk. SO it maybe?
        for(int i=0;i<result.size();i++){
            System.out.println("ordernumber: " + result.get(i).getOrderNumber());
            System.out.println("arraysize: " + result.size());
            orderNumbers.add(Integer.toString(result.get(i).getOrderNumber()));                 
        }
        for (int i=0; i<orderNumbers.size();i++){
            values.add(orderNumbers.get(i));
        }
        cellList.setRowData(values);
    }

});

基本上我正在尝试创建一个需要 List 作为输入的 cellList。我从数据库查询中获取订单的arrayList,然后遍历以提取订单号,然后将其放入arrayList,然后我想将其转换为List 以在cellList 中使用。有人可以解释为什么我不能这样做以及正确的方法应该是什么?

【问题讨论】:

  • 我看不出您要在哪里进行类型转换。 ArrayList&lt;E&gt;List&lt;E&gt; 的子代,这意味着 ArrayList 始终是 List,并且您可能希望使用 ArrayList 类中的所有方法(例如 size()get()、@987654332 @等)也都可以在List中找到!这就是继承的美妙之处:)你能给我们一个堆栈跟踪,这样我们就可以看到你的确切问题。?
  • values 似乎没有在任何地方初始化,你会先得到一个NullPointerException
  • 此代码示例似乎缺少一些东西。

标签: java arrays gwt arraylist


【解决方案1】:

我不明白您遇到的问题,因为 ArrayList 实现了 List,而 List 是一个接口。

你可以改变这一行

ArrayList<String> orderNumbers = new ArrayList<String>(); 

到:

List<String> orderNumbers = new ArrayList<String>();

【讨论】:

  • 我的问题在我的脑海中,我在想我必须将 Arraylist 转换为 List,我没有意识到 Arraylist 是一个 List 类型,我认为它是它自己的东西。我改变了那条线,现在它可以工作了。谢谢。
  • 个人建议,声明变量时尽量使用接口,这样以后可以更改实现。想象一下,例如从 ArrayList 切换到 LinkedList,如果您的方法需要 List,则无需更改任何内容。
  • @Alex - 对于使用 GWT 的项目,尤其是 GWT-RPC,这不是一个好的建议。来自Google's developer guide:“然而,为了充分利用多态性,在定义服务接口时,您仍应尽量保持设计允许的特定性。增加的特定性允许编译器更好地删除不必要的代码当它优化您的应用程序以减小尺寸时。”
  • 我认为一般来说它是good advice。谢谢你的链接,我绝对不知道!
  • 我也不明白这个问题,但是 Eclipse 有类似 List&lt;List&lt;String&gt;&gt; whatever () {List&lt;ArrayList&lt;String&gt;&gt; result=null;return result;} 这样的问题我讨厌这种事情的 Java 类型系统......
【解决方案2】:

ArrayList&lt;anything&gt; 已经是List&lt;anything&gt;,因为ArrayList 实现了List 接口。不需要强制转换。

【讨论】:

    【解决方案3】:

    java.util.List 是一个接口,ArrayList&lt;E&gt; 已经实现了它,你不必强制转换任何东西

    【讨论】:

      【解决方案4】:

      ArrayListList,所以我不确定会发生什么。不过,我确实有一个怀疑。查看文件顶部的导入。也许您在文件顶部有一行:

      import java.awt.List;
      

      我已经告诉我的 IDE 不要使用 java.awt.List 作为 List 的建议。但是,您仍然编写了太多代码。考虑 Java 的 foreach 循环:

      @Override
      public void onSuccess(ArrayList<Order> result) {
          List<String> orderNumbers = new ArrayList<String>();               
          for (Order order: result) {
              orderNumbers.add(Integer.toString(order.getOrderNumber()));                 
          }
          values.addAll(orderNumbers);
          cellList.setRowData(values);
      }
      

      但您根本不需要 orderNumbers 变量。只需使用 values.add 而不是 orderNumbers.add。然后,你为什么要使用List&lt;String&gt;?您能否通过List&lt;Integer&gt; 生存并避免转换?

      哎呀——您正在使用 GWT。 Google 是否仍然建议程序员不要使用接口,这样它就不必在 Java 中生成每个具体的实现?

      【讨论】:

      • 感谢您的建议,我清理了我的代码。一旦我发现 arraylist 本身就是一个列表。
      猜你喜欢
      • 2011-02-22
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 2011-12-04
      • 2011-08-20
      • 1970-01-01
      • 1970-01-01
      • 2017-11-09
      相关资源
      最近更新 更多