【问题标题】:Get Long value from Long Array exception in Java从 Java 中的 Long Array 异常中获取 Long 值
【发布时间】:2016-04-10 16:59:33
【问题描述】:

我想尝试从 Long Array 中获取 Long 值。但我有这个例外:

线程“主”java.lang.ClassCastException 中的异常: java.lang.Integer 不能转换为 java.lang.Long

这样的代码:

import java.util.List;        
    public class Bar {        
        private List<Long> departments;      

        public List<Long> getDepartments() {
            return departments;
        }     

        public void setDepartments(List<Long> departments) {
            this.departments = departments;
        }           

    }


import java.util.List;    
import net.sf.json.JSONObject;    
public class Foo {    
    public static void main(String[] args) {    
        String str = "{\"departments\":[20,22]}";
        JSONObject jsonObject = JSONObject.fromObject(str);
        Bar bar = (Bar) jsonObject.toBean(jsonObject, Bar.class);
        List<Long> departments = bar.getDepartments();
        Long depId = departments.get(0);// Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long
System.out.println(depId);

    }    
}

【问题讨论】:

  • 可能是因为 jsonObject.toBean 在运行时注入了一个 Integer 列表而不是 Long
  • 如果有帮助,请尝试JSONArray jsonArray = jsonObject.getJSONArray("department"); Collection&lt;Long&gt; depts = JSONArray.toCollection(jsonArray, List.class);。自己没试过。以下是 toCollection() 方法的 JavaDoc:考虑泛型返回一个 List 或一个 Set。

标签: java


【解决方案1】:
public static void main(String[] args) {

    String str = "{\"departments\":[20,22]}";
    JSONObject jsonObject = JSONObject.fromObject(str);
    Bar bar =  (Bar) JSONObject.toBean(jsonObject, Bar.class);
    List departments = bar.getDepartments();
    Long i=  Long.valueOf(departments.get(0).toString());
    System.out.println(i);
    System.out.println(departments.get(0).getClass().getName());

}

这是一个 net.sf json 转换错误,只是转换为字符串

【讨论】:

  • 你可以使用jackson来取消json cast异常
  • 不能转换为字符串。尝试 String s = department.get(0).toString();抛出同样的异常。
  • ```public static void main(String[] args) { String str = "{\"departments\":[20l,22l]}"; JSONObject jsonObject = JSONObject.fromObject(str); Bar bar = (Bar) JSONObject.toBean(jsonObject, Bar.class);列出部门 = bar.getDepartments(); Long i= Long.valueOf(departments.get(0).toString()); System.out.println(i); System.out.println(departments.get(0).getClass().getName()); }
  • 任何类都可以串
【解决方案2】:

你可以这样试试,

Long depId = (Long) departments.get(0).intValue();

intValue 返回 int 的位置,但随后将其转换为 Long。

【讨论】:

  • @MuammerTÜZÜN 你能否展示departments.get(0) 在不将其存储到任何变量的情况下实际返回的内容。只需记录或打印它
【解决方案3】:

试试这个

Long depId = departments.get(0).longValue();

编辑:

Integer i = 9;
Long l = i.longValue();
System.out.println(i + "  " + l);

【讨论】:

  • 没有用。线程“主”java.lang.ClassCastException 中的异常:java.lang.Integer 无法在 com.test.Foo.main(Foo.java:16) 处转换​​为 java.lang.Long
  • departments.get(0) 方法的返回类型是 Long,但它尝试返回 Integer。这就是问题的根源。
  • 如果departments.get(0) 仍然返回Integer,它将通过longValue() 方法转换为Long。请再次检查并通知我。
  • @Md. muzahidul Islam 不要在 Java 中思考,这是由于 toBean 方法中的错误导致的字节码级别的问题。
【解决方案4】:

Long i= Long.valueOf(departments.get(0).toString());会解决你的问题

【讨论】:

  • 你的代码在什么时候工作;列出部门 = ... ;但我这样定义 List部门 = .. ;同样的错误继续。
【解决方案5】:

toBean() 方法使用List&lt;Integer&gt; 生成一个不同的类。 由于这个错误,我认为没有任何理由将 Integer 转换为 Long。 将部门更改为 List&lt;Integer&gt; 或使用另一个 JSON 解析器。

【讨论】:

    【解决方案6】:

    JSON 本身没有IntegerLong 的概念,它只知道Number。如果不是浮动品脱值,则 JSONObject 会将 Number 值或其中的列表放入 Integer 对象中。

    您将 List 声明为 List&lt;Long&gt;这一事实与 JSONObject 无关,因为此泛型类型信息在编译的类代码中不可用(类型擦除),departments 只是一个对象列表和所以 JSONObject 愉快地填充了 Integer 对象。

    您可以将 departments 声明为 List&lt;Integer&gt; 或使用其他转换方法(查看 ujulu 对您帖子的评论)

    【讨论】:

      猜你喜欢
      • 2014-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多