Sự khác biệt giữa tờ khai Class
và tờ khai Class<?>
là gì.Sự khác biệt giữa Lớp học và Lớp học <?>
Class a;
Class<?> b;
Sự khác biệt giữa tờ khai Class
và tờ khai Class<?>
là gì.Sự khác biệt giữa Lớp học và Lớp học <?>
Class a;
Class<?> b;
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 Class
và Class<?>
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.
Lớp javadoc:
Loại Các tham số:
T
- kiểu của lớp mô hình của đối tượngClass
này. Ví dụ: loạiString.class
làClass<String>
. Sử dụngClass<?>
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.
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.
"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
Bạn nên tránh những lớp lớp bất cứ nơi nào có thể ... –
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ể. –