未处理的异常 java.lang.ClassCastException:无法转换 java.util.TreeMap

Unhandled exception java.lang.ClassCastException: java.util.TreeMap cannot be cast

我正在尝试将哈希图包装到另一个 class 中,但我一直收到这个

Unhandled exception java.lang.ClassCastException: java.util.TreeMap cannot be cast

很简单,不知道为什么 Java 会抱怨。这是包装纸:

public class ResponseHeader extends HashMap<String, String> {
}

这是演员表

protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
    try {
        // Save http headers
        mResponseHeaders = (ResponseHeader)response.headers;

response.headers 定义如下:

public final Map<String, String> headers;

我查看了这个帖子,但这不是我想要的。

Why does TreeSet throws ClassCastException

有什么解释吗?谢谢!

补充了,忘记了

private ResponseHeader mResponseHeaders = new ResponseHeader();

实例字段headers定义为

public final Map<String, String> headers;

关于 headers 的类型,除了它是 Map 之外,您不能做任何进一步的假设; NetworkResponse 的实现可以自由决定使用什么实现,只要它实现了 java.util.Map - 它可以根据情况使用不同的实现,或者在下一版本的库中使用不同的实现,等等.

但是从异常中可以看出,实际上,此时NetworkResponse正在使用java.util.TreeMap作为headers的实现。

您正在尝试将其转换为 ResponseHeader,它是 HashMap 的子class(但这没关系,即使 headersHashMap,因为您正试图转换为 ResponseHeader

这根本不是实例字段引用的对象的正确类型 headers。从你的问题中不清楚为什么你认为应该可以将 headers 转换为 ResponseHeaders,但这是不可能的。

你是说你正在尝试 "wrap HashMap into another class"。实际上,您是在扩展 HashMap,而不是包装它。如果您扩展 class,您将创建一个新类型,它不等于您扩展的类型。也许您正在尝试向 Map 添加您想要的功能。有更好的方法可以做到这一点。 (包装就是其中之一)