2012-07-14 51 views
7

Tôi có một lớp học mà deserializes một ArrayList Generics với chức năng này cũng giống như mô tả trong câu trả lời đầu tiên của chủ đề này: Java abstract class function generic TypeLỗi đúc TypeToken Ký tự gõ vào khi deserializing với gson

public <T> ArrayList<T> arrayType(String data){ 
    return g.fromJson(data, TypeToken.get(new ArrayList<T>().getClass())); 
} 

Eclipse hỏi tôi để cast TypeToken kết quả này (Sinde chức năng fromJson cần một loại, không phải là một TypeToken)

public <T> ArrayList<T> arrayType(String data){ 
    return g.fromJson(data, (Type) TypeToken.get(new ArrayList<T>().getClass())); 
} 

kết quả tôi nhận được lỗi này:

java.lang.ClassCastException: com.google.gson.reflect.TypeToken cannot be cast to java.lang.reflect.Type 

Tại gson user manual họ cho bạn biết đây là cách đúng đắn về gọi hàm

Type collectionType = new TypeToken<Collection<Integer>>(){}.getType(); 
Collection<Integer> ints2 = gson.fromJson(json, collectionType); 

và tôi không thể nhìn thấy những gì tôi làm sai (nếu nó là một câu trả lời hợp lệ, tại sao tôi nhận dàn diễn viên này lỗi?)

+1

'new ArrayList () .getClass()' giống hệt với hàm 'ArrayList.class' – newacct

Trả lời

10

Bạn đang gọi số TypeToken.get, trả về số TypeToken - không phải là Type. trong ví dụ bạn đang hiển thị hoạt động, nó đang sử dụng TypeToken.getType(), trả về một Type.

Vì vậy, bạn có thể sử dụng:

return g.fromJson(data, TypeToken.get(new ArrayList<T>().getClass()).getType()); 

... và đó sẽ trả lại cho bạn một Type, nhưng nó có thể không là những gì bạn thực sự muốn. Đặc biệt, do loại tẩy xoá sẽ trả lại cho bạn cùng một loại bất cứ điều gì T bạn chỉ định từ trang web cuộc gọi. Nếu bạn muốn loại thực sự phản ánh ArrayList<T>, bạn sẽ cần phải chuyển lớp học vào phương pháp, mặc dù tôi không hoàn toàn chắc chắn nơi để đi từ đó. (Java API phản chiếu không phải là terribly rõ ràng khi nói đến Generics, trong kinh nghiệm của tôi.)

Là một sang một bên, tôi mong đợi một phương pháp gọi là arrayType để có cái gì để làm với mảng, không ArrayList.

+0

, nhanh, im kiểm tra nó. Dù sao cảm ơn trước. – dinigo

+0

Tôi cuối cùng đã phải vượt qua loại như một đối số. Những gì bạn đã cho tôi phân tích cú pháp JSON của tôi mà không có bất kỳ cảnh báo hoặc lỗi nào nhưng cuối cùng nó không cho phép tôi truy cập vào từng phần tử của ArrayList. Nó chỉ thất bại khi truy cập chúng ngay cả khi độ dài là chính xác và phương thức 'toString()' đã làm việc. – dinigo

Các vấn đề liên quan