2016-02-18 4 views
-1

Я пытаюсь обернуть HashMap в другой класс, но я получаю этуНеобработанного исключения java.lang.ClassCastException: java.util.TreeMap не может быть брошен

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(); 
+0

А что такое 'mResponseHeaders'? Вы показали нам «заголовки». –

+0

Я думаю, ваша проблема заключается в том, чтобы придать 'TreeMap'' HashMap'. Чтобы решить эту проблему, см. Этот ответ: http://stackoverflow.com/a/19512912/1488669 – fanton

+0

Извините, я исправил недостающую строку, но спасибо fanton. Это сработало: mResponseHeaders.putAll (response.headers); – gmmo

ответ

0

поле Instance headers определяется как

public final Map<String, String> headers; 

Вы не можете делать какие-либо дополнительные предположения относительно типа headers, чем это Map; реализация NetworkResponse может принять решение о том, какую реализацию использовать до тех пор, пока она реализует java.util.Map - она ​​может использовать различные реализации в зависимости от обстоятельств или другую в следующей версии библиотеки и т. д.

Но как вы можно увидеть из исключения, фактически, на данный момент NetworkResponse использует java.util.TreeMap в качестве реализации для headers.

Вы пытаетесь бросить его ResponseHeader, который является подклассом HashMap (но это не имеет значения, он не будет работать, даже если headers был HashMap, потому что вы пытаетесь бросить в ResponseHeader.

Это просто не правильный тип объекта, на который ссылается поле экземпляра headers. не ясно из вашего вопроса, почему вы предполагаете, что это должно быть возможным, чтобы бросить headers к ResponseHeaders, но это просто не возможно.

Вы говорите, что пытаетесь ap HashMap в другой класс ". На самом деле вы распространяете HashMap, не обертывая его. Если вы расширяете класс, вы создаете новый тип, который не соответствует типу, который вы расширили. Возможно, вы пытаетесь добавить функциональность к Map, которую вы хотели бы. Есть лучшие способы сделать это. (Обертка является одним из них)

+0

Я не полностью слежу за вашим предупреждением.Я расширяю класс, но считаете ли вы, что это может потерпеть неудачу в будущем, если изменится NetworkResponse? mResponseHeaders.putAll (response.headers); – gmmo