2009-06-17 40 views

Trả lời

34

Nó giống như với tất cả các loại generic và thô:

Class   // An unknown class (raw type) 
Class<?>  // An unknown class (generic version) 
Class<String> // The String class 

Trong trường hợp đặc biệt này không có nhiều khác biệt thực tiễn giữa ClassClass<?> vì cả hai đều biểu thị một lớp chưa biết. Tùy thuộc vào các khai báo hiện có, trình biên dịch có thể yêu cầu một kiểu generic thay vì một kiểu thô.

Nhưng: Vì Java 1.5 bạn nên sử dụng biểu mẫu chung bất cứ khi nào có thể. Class<?> tuyên bố rõ ràng rằng bạn có nghĩa là "một lớp không xác định", Class<String> rõ ràng nói rằng bạn có nghĩa là lớp học String. Số nguyên Class có thể có nghĩa là cả hai.

Cuối cùng, nó không tạo ra sự khác biệt lớn cho trình biên dịch nhưng nó tạo ra sự khác biệt lớn trong việc đưa ra ý định mã của bạn dễ hiểu hơn và dễ bảo trì hơn.

+2

Bạn nên tránh những lớp lớp bất cứ nơi nào có thể ... –

+26

Bạn nên tránh sử dụng quy tắc mà không giải thích bất cứ nơi nào có thể. –

10

Lớp javadoc:

Loại Các tham số: T - kiểu của lớp mô hình của đối tượng Class này. Ví dụ: loại String.classClass<String>. Sử dụng Class<?> nếu lớp học được mô hình hóa không xác định.

Sử dụng Class mà không có tham số kiểu tương tự như sử dụng bất kỳ lớp generic (Map, List, vv) mà không có tham số kiểu - hoặc đó là một di sản sử dụng pre-1.5 hoặc nó chỉ là một phân đoạn của mã nào không quan tâm đến việc truyền kiểu không được chọn.

2

Lớp <?> cho thấy bạn đang cố ý viết mã Java 5 cấp không biết hoặc quan tâm bạn đang xử lý lớp nào. Rời khỏi làm cho nó trông giống như mã cũ hoặc mã được viết bởi một người chưa học Generics.

1

"nó trông giống như mã cũ hoặc mã được viết bởi một người chưa học về Generics." Đây là một tuyên bố đúng. Class (phát âm là "class of unknown"), có nghĩa là, một class có kiểu khớp với bất cứ thứ gì. Nó được gọi là một loại thẻ hoang dã vì lý do rõ ràng.

ví dụ:

public void drawAll(List<Shape> shapes) { 
    for (Shape s: shapes) { 
     s.draw(this); 
    } 
} 

quy tắc kiểu nói rằng drawAll() chỉ có thể được gọi vào danh sách chính xác Shape: nó có thể không, ví dụ, được kêu gọi, nói rằng, một List<Circle>. Điều đó là không may, vì tất cả các phương pháp không đọc được hình dạng từ danh sách, vì vậy nó chỉ có thể được gọi là trên một List<Circle>.

Điều chúng tôi thực sự muốn là để phương thức chấp nhận danh sách bất kỳ loại hình dạng nào.

public void drawAll (List <? extends Shape> shapes) { 

} 

đọc thêm: http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html

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