Không thực sự là một lập trình viên Java ở đây, nhưng đọc một số giấy tờ tốt về Generics.
Có, bạn nên thêm một số ký tự đại diện hoặc loại chính xác (Class<MySpecialClass>
) để thêm độ an toàn. Lý do là lớp là một chung chung. Vì vậy, Class<Bar>
và Class<Foo>
giống nhau sau khi xóa thông số loại chung của chúng. Tất cả chúng đều trở thành Class
, cái gọi là kiểu thô. Sự xóa bỏ đó xảy ra khi biên dịch. Một số ví dụ để minh họa điều này nơi trình biên dịch sẽ giúp bạn với đúc tự động (xử lý ngoại lệ bỏ qua cho ngắn gọn):
class Mine { }
class Vara {
public static void main(String... args) {
{ // works. translated to Mine m = (Mine) c.newInstance();
Class<Mine> c = Mine.class;
Mine m = c.newInstance();
}
{ // doesn't work. need a cast: Mine m = (Mine) c.newInstance();
Class c = Mine.class; // also Class<?> or Class<? extends Object>
Object o = c.newInstance(); // but this works. pointing to a Mine
Mine m = (Mine) c.newInstance(); // needs a manual cast
}
}
}
Nói Class<?>
(và tương đương Class<? extends Object>
), bạn nói với trình biên dịch bạn thực sự muốn có một lớp mà T
là Object và không vô tình sử dụng loại thô. Nhưng nó sẽ không thêm bất kỳ phôi tiện lợi nào. Tất cả các generics đó làm là chèn phôi tự động cho bạn, để đúc từ Object
đến loại đích. Generics giống nhau dù được sử dụng với kiểu U hoặc với kiểu T khi chạy vì lý do tương thích với các phiên bản java cũ hơn.
Nguồn
2008-12-16 08:05:53