2012-07-02 34 views
6

Tôi đang truy cập một cá thể MongoDB từ Java được viết từ một ứng dụng Rails. Tôi đang lấy các giá trị số nguyên cần được lưu trữ trong một Long, bởi vì chúng có thể vượt quá 32 bit.Lỗi loại lỗi dài khi đọc Trường số nguyên từ MongoDB trong Java

Mã này sẽ biên dịch:

this.profile_uid = (Long)this.profile.get("uid"); 

Tuy nhiên, tôi nhận được một loại chuyển đổi thời gian chạy lỗi:

Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long 

này có lẽ vì lĩnh vực này được trả về bởi Mongo như Integer, nhưng tôi biết rằng một số ID có thể đến như Longs và vì nhiều lý do tôi không thể thay đổi loại được viết cho DB (từ một ứng dụng khác); nó có thể là 32-bit trong một số trường hợp và 64-bit trong những trường hợp khác.

Ứng dụng Java cần xử lý một trong hai và tôi không muốn gặp phải một số loại sự cố cắt hoặc tràn. Tôi muốn đọc nó như là một Long ở phía Java.

Tôi đã thử giải pháp thay thế bên dưới và có vẻ như chạy, nhưng tôi không biết liệu tôi có an toàn với các vấn đề về cắt xén hoặc tràn hay không theo cách này. Tôi không chắc chắn những gì các lớp học Number trong Java không.

this.profile_uid = ((Number)this.profile.get("uid")).longValue(); 

Đây có phải là hợp pháp không? Nó có tác dụng phụ gì? Có cách nào khác/tốt hơn không?

+1

bạn có thể kiểm tra loại giá trị trả về bằng cách sử dụng ** instaceof ** và sau đó đưa ra quyết định phù hợp cho việc nhập mã –

Trả lời

5

Giải pháp được đề xuất của bạn là hợp pháp. Number là siêu lớp của tất cả các lớp số trong Java. Miễn là trường "uid" của bạn ở định dạng số, this.profile.get("uid")) sẽ trả về một đối tượng là một số lớp con của Number (và do đó dàn diễn viên đến Number sẽ luôn hoạt động).

Tất cả các lớp con cụ thể của Number phải triển khai phương pháp longValue(), vì nó được định nghĩa là phương pháp trừu tượng trong lớp Number.

Integer.longValue() chuyển giá trị int nội bộ thành một thời lượng dài. Long.longValue() chỉ trả về giá trị nội bộ dài.

+0

Cảm ơn rất nhiều. Đó chính là điều tôi cần biết. –

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