Giả sử có đoạn mã sau:Tại sao công việc đúc ngầm ẩn trong khi đúc phản chiếu ném ngoại lệ?
@SuppressWarnings("unchecked")
public static <T> T implicitCaster(Class<T> cls, Object o) {
return (T) o;
}
public static <T> T reflectionCaster(Class<T> cls, Object o) {
return cls.cast(o);
}
Mã này hoạt động như mong đợi trong cả hai trường hợp với ngoại lệ sau, được tìm thấy trong nguyên thủy:
public static void main(String[] args) {
System.out.println(implicitCaster(int.class, 42));
System.out.println(reflectionCaster(int.class, 42));
}
Cuộc gọi đầu tiên làm việc như mong đợi nhưng cuộc gọi thứ hai ném java.lang.ClassCastException
.
Đây có phải là trường hợp góc trong đó autoboxing bị bỏ qua không? Hoặc là nó không thể cung cấp autoboxing trong trường hợp này, phản ánh đúc? Hoặc có điều gì khác gây ra sự không thống nhất này?
Chỉnh sửa: gọi mã này làm việc như mong đợi:
public static void main(String[] args) {
System.out.println(implicitCaster(Integer.class, 42));
System.out.println(reflectionCaster(Integer.class, 42));
}
Tôi đã viết ở đó rằng mã hoạt động cho mọi lớp nhất định ngoại trừ các nguyên thủy; vì vậy việc đúc một đối tượng cho một loại chung là có thể. Thứ hai, bạn có thể đúc các đối tượng để nguyên thủy. – m3th0dman
@ m3th0dman: Tôi không nói điều đó là không thể. Tôi nói nó không có hiệu lực trong thời gian chạy. – SLaks
Tôi hiểu ngay bây giờ; nhưng không phải loại phá vỡ hợp đồng của phương pháp đúc? Về mặt kỹ thuật diễn viên là có thể. – m3th0dman