2008-12-16 31 views
9

Trong một bó o' nơi trong mã của tôi, tôi có một cái gì đó như thế này:Thực hành tốt để thay thế Lớp học với Lớp học <? mở rộng Object> để tránh cảnh báo?

public Class mySpecialMethod() { 
    return MySpecialClass.class; 
} 

gây cảnh báo

Class là một loại nguyên liệu. Tham chiếu đến loại chung Loại phải là được tham số hóa.

Nhưng, nếu tôi thay

Class

với

Class<? extends Object>

cảnh báo sẽ biến mất.

Thực tiễn đơn giản này có ổn không, hoặc có thể gây rắc rối sau này không?

Trả lời

15

Đó là điều đúng để thực hiện chỉ khi thực sự không có lớp cơ sở chung hoặc giao diện nào mà đối tượng Lớp cần đại diện.

Ngoài ra Class<?> có hiệu quả giống như Class<? extends Object>.

6

Tùy thuộc vào những gì bạn muốn đạt được, bạn có thể thậm chí chính xác hơn:

public Class<MySpecialClass> mySpecialMethod() { 
    return MySpecialClass.class; 
} 
4

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>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.

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