【问题标题】:How to convert java.lang.Object to ArrayList?如何将 java.lang.Object 转换为 ArrayList?
【发布时间】:2011-09-08 11:38:41
【问题描述】:

我有一个有效的ArrayList 对象,格式为java.lang.Object。我必须再次将Object 转换为ArrayList。我试过这个:

Object obj2 = from some source 。 . ;
ArrayList al1 = new ArrayList();
al1 = (ArrayList) obj2;
System.out.println("List2 值:"+al1);

但它正在打印null。 我怎样才能做到这一点?

【问题讨论】:

  • 如果打印的是 null 你在执行这段代码之前有问题;隐藏在“from source ...”中
  • 你得到了什么错误,对我来说它工作正常。还要提供更多细节, Object obj2 = from some source 。 . ;对于上面的 obj2 你正在分配什么
  • 下面是我试过的代码,它工作正常。ArrayList al11 = new ArrayList(); al11.add("a"); al11.add("b");对象 obj2 =al11; ArrayList al1 = new ArrayList(); al1 = (ArrayList) obj2; System.out.println("List2 值:"+al1);
  • @Damodar 您的第二条评论对我也很有效。但是我的隐藏方法以对象的形式返回一个字符串,因为我得到了以下异常:线程“main”中的异常 java.lang.ClassCastException:java.lang.String 无法转换为 java.util.ArrayList

标签: java java-6


【解决方案1】:

您可以创建一个静态 util 方法,将任何集合转换为 Java List

public static List<?> convertObjectToList(Object obj) {
    List<?> list = new ArrayList<>();
    if (obj.getClass().isArray()) {
        list = Arrays.asList((Object[])obj);
    } else if (obj instanceof Collection) {
        list = new ArrayList<>((Collection<?>)obj);
    }
    return list;
}

您还可以混合以下验证:

public static boolean isCollection(Object obj) {
  return obj.getClass().isArray() || obj instanceof Collection;
}

【讨论】:

    【解决方案2】:
        Object object = new Object();
    
        // First way
        List objects1 = new ArrayList<Object>();
        objects1.add(object);
    
        // second way
        List<Object> objects2 = Arrays.asList(object);
    
        // Third way
        List<Object> objects3 = Collections.singletonList(object);
    

    【讨论】:

      【解决方案3】:

      你也可以这样做:

        new ObjectMapper().convertValue(sourceObject, new TypeReference<List<YourTargetClass>>() {});
      

      【讨论】:

        【解决方案4】:

        2021 年的答案(Java 8+)

        假设您的对象是一个有效的 List 对象,您可以使用:Collections.singletonList(object) -- 返回一个仅包含指定对象的不可变列表。

        List<Object> list = Collections.singletonList(object);
        

        如果您希望它采用特定的数据类型,请使用Stream.of(object)

        List<String> list = Stream.of(object).map(Object::toString).collect(Collectors.toList())
        

        同样,你可以改变map中的方法来转换成你需要的数据类型。

        【讨论】:

          【解决方案5】:

          如果obj2 在演员表之前已经是null,这只会导致null,所以你的问题比你想象的要早。 (另外,如果你要立即分配给它,你不需要构造一个新的 ArrayList 来初始化al1。只需说ArrayList al1 = (ArrayList) obj2;。)

          【讨论】:

          • obj2 不为空。我打印了 obj2 的值。
          • 其实obj2是字符串形式的。
          【解决方案6】:

          一个有趣的提示:似乎在 JavaFX 应用程序线程上尝试从一个对象强制转换为一个列表总是会导致 ClassCastException。

          我和你有同样的问题,没有答案。玩了一段时间后,我唯一能缩小范围的就是线程。运行代码以在 UI 线程以外的任何其他线程上强制转换按预期成功,并且正如本节中的其他答案所建议的那样。

          因此,请注意您的源代码没有在 JavaFX 应用程序线程上运行。

          【讨论】:

            【解决方案7】:

            宁可将其转换为对象数组。

            Object obj2 = from some source . . ;
            Object[] objects=(Object[])obj2;
            

            【讨论】:

              【解决方案8】:

              不建议从 java.lang.Object 直接转换为具有 T 元素的 ArrayList&lt;T&gt;,因为它可能导致转换异常。推荐的方法是先转换为T的原始数组,然后使用Arrays.asList(T[]) 从 java javax.ws.rs.core.Response 获取实体的方法之一如下 -

                  T[] t_array = response.readEntity(object);
                  ArrayList<T> t_arraylist = Arrays.asList(t_array);
              

              您仍然会收到 Unchecked cast 警告。

              【讨论】:

                【解决方案9】:

                转换失败(java.lang.ClassCastException: java.lang.String cannot be cast to java.util.ArrayList)因为你肯定有一些不是的对象数组列表。验证不同对象的类型。

                【讨论】:

                  【解决方案10】:

                  希望对你有帮助

                  import java.util.ArrayList; 
                  public class Demo {
                  
                   public static void main(String[] args) {
                      Object obj2 =null;
                      ArrayList al1 = (ArrayList) obj2;
                      al1 = (ArrayList) obj2;
                      System.out.println("List2 Value: " + al1);
                      }
                   }
                  

                  obj2 对象在转换为 ArrayList 之前默认为 null。这就是将 'al1' 打印为 null 的原因。

                  【讨论】:

                    猜你喜欢
                    • 2020-07-11
                    • 1970-01-01
                    • 2022-01-19
                    • 2021-02-21
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2017-08-01
                    • 2016-04-27
                    相关资源
                    最近更新 更多