Sẽ không có bất kỳ ClassCastException, trừ khi T của bạn có một số cơ sở:
public class GenericsTest
{
public static void main(String[] args)
{
System.out.println(cast(Integer.valueOf(0)));
System.out.println(GenericsTest.<Long> cast(Integer.valueOf(0)));
System.out.println(GenericsTest.<Long> cast("Hallo"));
System.out.println(castBaseNumber(Integer.valueOf(0)));
System.out.println(GenericsTest.<Long> castBaseNumber(Integer.valueOf(0)));
System.out.println(GenericsTest.<Long> castBaseNumber("Hallo"));
}
private static <T extends Number> T castBaseNumber(Object o)
{
T t = (T)o;
return t;
}
private static <T> T cast(Object o)
{
T t = (T)o;
return t;
}
}
Trong ví dụ trên, sẽ có không có ClassCastException trong 5 cuộc gọi đầu tiên để truyền và castBaseNumber. Chỉ có cuộc gọi thứ 6 ném một ClassCastException, bởi vì trình biên dịch dịch một cách hiệu quả hàm cast() để trả về (Object) o và hàm castBaseNumber() để trả về (Number) o ;. Wenn bạn viết
String s = GenericsTest.<Long> cast("Hallo");
Bạn sẽ nhận được một ClassCastException, nhưng không theo phương pháp truyền, nhưng tại thời điểm gán cho s.
Vì vậy, tôi nghĩ rằng, "T" của bạn không chỉ là "T", nhưng "T mở rộng một cái gì đó". Vì vậy, bạn có thể kiểm tra:
Object o = decoder.readObject();
if (o instanceof Something)
restoredItem = (T) o;
else
// Error handling
Nhưng điều này sẽ vẫn dẫn đến lỗi sau này khi bạn sử dụng lớp học.
public Reader<T extends Number>{...}
Long l = new Reader<Long>("file.xml").getValue(); // there might be the ClassCastException
Chỉ trong trường hợp này, tư vấn của Tom có thể hữu ích.
Nguồn
2008-10-09 12:51:44
Được gắn thẻ lại để sử dụng các thẻ ngoại lệ phổ biến hơn. –