java.lang.ClassCastException: myClass 无法转换为 class java.util.List

java.lang.ClassCastException: myClass cannot be cast to class java.util.List

我有一个名为 MyClass 的 class 设置,其中包含两个列表:

public class MyClass {
    List<String> list1;
    List<Descriptor> list2;

    public List<String> getList1() { return list1; }

    public List<Descriptor> getList2() { return list2; }

    public void setList1(List<String> list1) { this.list1 = list1; }

    public void setList2(List<Descriptor> list2) { this.list2 = list2; }
}

在另一个 class 中,我想基于 MyClass 创建一个 object 并将该对象提供给方法

MyClass class = new MyClass();
class.setList1(someList);
class.setList2(otherList);
return Response.status(HttpStatus.OK_200).entity(class).build();

方法 .entity 需要一个对象,但我抛出 java.lang.ClassCastException 错误并且无法弄清楚原因。

提供的所有内容都是一个列表,所以我不明白为什么会抛出此错误

你是说:MyClass(实体)由列表组成,因此它是一个列表。

这句话简直是疯了:我的房子是砖砌的,所以我的房子是砖。

这里的核心工作是将您传递给 entity() 方法的内容转换为字节包,因为 HTTP 协议发送字节。这是如何运作的?这就是您需要了解您的工具和库如何工作的地方:我假设您在这里使用 Jersey/JAX-RS。即设置如下:

  • 您可以发送任何对象
  • 但是,该对象通过一堆已注册的 'translators' 假脱机,每个对象都有能力将对象类型的子集转换为字节流。开箱即用,系统知道如何 'translate' 字符串(这很简单 - 使用 .getBytes(someCharsetEncoding) 将字符串转换为字节)和其他一些事情。但如果需要,您可以添加更多翻译人员。这就是 entity() 方法采用任何对象的原因。
  • 一些注册翻译人员认为它们是列表,而实际上它们不是,这导致了您的错误。 (因为你有一个 MyClass 的实例,它不是列表。当然,它的所有字段都是列表,但是,房子不是砖)。

但解决方案(可能)不在于修复 'translator'。首先想清楚:你实际上想做什么? HTTP只是发送字节,那么你要发送什么字节呢? MyClass 对象需要以一种或另一种方式转换为字节。那应该怎么走?什么服务在调用这个?它有什么作用?

这是一个示例答案:

某些网站有 javascript 调用此端点并通过 JSON 库将其接收到的任何内容转换为 javascript 对象,或者只是 eval()ing 它。

如果这是您的答案,那么您希望 MyClass 实体变成 JSON。 Jackson 可以为您做到。