Câu hỏi liên quan

0 Phiếu
3 Câu trả lời
0 Phiếu
0 Câu trả lời
0 Phiếu
2 Câu trả lời

Không có ClassCastException khi đúc để chung type khác nhau cho các lớp học thực tế


0 Phiếu
Đã hỏi 25/5/2016 bởi theTime (420 điểm)
Tôi có một số code trông như thế này (một phần của một test tiêu cực của method get):
import java.util.*;
public class Test {
    Map<String, Object> map = new HashMap<>();
    public static void main (String ... args) {
        Test test = new Test();
        test.put("test", "value"); // Store a String
        System.out.println("Test: " + test.get("test", Double.class)); // Retrieve it as a Double
    }
    public <T> T get(String key, Class<T> clazz) {
        return (T) map.get(key);
    }
    public void put(String key, Object value) {
        map.put(key, value);
    }
}
tôi đã mong nó để ném một ClassCastException nhưng nó chạy qua thành công in ấn:
Test: value
lý do tại sao nó không ném?

1 câu trả lời

0 Phiếu
Đã trả lời 04/6/2016 bởi Vag_7736 (1,650 điểm)
Đó là bởi vì bạn đang đúc để chung type T, mà là bị xóa tại thời gian chạy, giống như tất cả Java generics. Vì vậy, những gì thực sự xảy ra lúc chạy, là bạn đúc để Object và không Double. Lưu ý rằng, ví dụ, nếu T được định nghĩa như là <T extends Number>, bạn sẽ đúc để Number (nhưng vẫn không Double). Nếu bạn muốn làm một số thời gian chạy type việc kiểm tra, bạn cần phải sử dụng clazz tham số thực tế (trong đó có sẵn tại thời gian chạy) và không chung type T (mà là bị xóa). Ví dụ, bạn có thể làm một cái gì đó như thế:
public <T> T get(String key, Class<T> clazz) {
    return clazz.cast(map.get(key));
}

ToughDev Q&A là gì?

Trang web hỏi đáp cho các bạn đam mê lập trình, phát triển phần mềm và các vấn đề kỹ thuật khác. Với sự giúp đỡ của bạn, chúng tôi hy vọng sẽ xây dựng thành công một thư viện đầy đủ các câu hỏi và trả lời về tất cả các vấn đề có liên quan đến lập trình!







...