Câu hỏi của tôi là như trên. Xin lỗi, đây có thể là một bản sao nhưng tôi không thể tìm thấy một ví dụ <?>
ở cuối.
Tại sao bạn không chỉ sử dụng Class
làm tham số?
Câu hỏi của tôi là như trên. Xin lỗi, đây có thể là một bản sao nhưng tôi không thể tìm thấy một ví dụ <?>
ở cuối.
Tại sao bạn không chỉ sử dụng Class
làm tham số?
Câu trả lời:
Class
là một lớp có thể tham số hóa, do đó bạn có thể sử dụng cú pháp Class<T>
trong đó T
là một loại. Bằng cách viết Class<?>
, bạn đang khai báo một Class
đối tượng có thể thuộc bất kỳ loại nào ( ?
là ký tự đại diện). Các Class
type là một kiểu có chứa meta-thông tin về một lớp học.
Luôn luôn là một thực hành tốt để tham khảo một loại chung bằng cách chỉ định loại cụ thể của anh ấy, bằng cách sử dụng Class<?>
bạn tôn trọng thực tiễn này (bạn biết Class
là có thể tham số hóa) nhưng bạn không giới hạn tham số của mình để có một loại cụ thể.
Tham khảo về Generics và Wildcards: http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html
Tham khảo về Class
đối tượng và sự phản chiếu (tính năng của ngôn ngữ Java được sử dụng để tự hướng nội): https://www.oracle.com/technetwork/articles/java/javareflection-1536171.html
Class
mà không cần một loại? Họ dường như đại diện cho điều tương tự.
?
ký tự đại diện." . Nếu bạn không đưa ký tự đại diện, trình biên dịch giả định rằng bạn đã quên loại hoặc không biết lớp này là chung chung và sẽ cảnh báo bạn về nó.
Class<?>
Class
không thể chuyển qua một đối số là loại nào Class<?>
, vì vậy Class<?>
sẽ thuận tiện hơn cho mọi tình huống.
Đây <?>
là một con thú. Nó thường dẫn đến sự nhầm lẫn và lỗi, bởi vì, khi bạn nhìn thấy nó đầu tiên, sau đó bạn bắt đầu tin, <?>
là một ký tự đại diện cho bất kỳ loại java nào . Điều đó không đúng sự thật. <?>
là loại không rõ , một sự khác biệt nhỏ và khó chịu.
Đó không phải là vấn đề khi bạn sử dụng nó Class
. Cả hai dòng làm việc và biên dịch:
Class anyType = String.class;
Class <?> theUnknownType = String.class;
Nhưng - nếu chúng ta bắt đầu sử dụng nó với các bộ sưu tập, thì chúng ta sẽ thấy các lỗi compXLime kỳ lạ:
List<?> list = new ArrayList<Object>(); // ArrayList<?> is not allowed
list.add("a String"); // doesn't compile ...
Chúng tôi List<?>
không phải là một bộ sưu tập, phù hợp với bất kỳ loại đối tượng nào. Nó chỉ có thể lưu trữ một loại: "loại không rõ ràng" huyền bí. Đó không phải là một loại thực sự, chắc chắn.
Nó có nghĩa là tham chiếu Class của bạn có thể giữ một tham chiếu đến bất kỳ đối tượng Class nào.
Về cơ bản nó giống như "Lớp" nhưng bạn đang hiển thị cho những người khác đọc mã của bạn mà bạn không quên về khái quát, bạn chỉ muốn một tham chiếu có thể chứa bất kỳ đối tượng Lớp nào.
Bruce Eckel, Suy nghĩ bằng Java:
Trong Java SE5, Class <?> Được ưa thích hơn Class đơn giản, mặc dù chúng tương đương và Class đơn giản, như bạn đã thấy, không tạo ra cảnh báo trình biên dịch. Lợi ích của Lớp <?> Là nó chỉ ra rằng bạn không chỉ sử dụng một tham chiếu lớp không cụ thể một cách tình cờ hoặc do thiếu hiểu biết. Bạn đã chọn phiên bản không cụ thể.
Đó là một Generics chữ. Điều đó có nghĩa là bạn không biết loại lớp mà Class
thể hiện này đại diện, nhưng bạn vẫn đang sử dụng phiên bản chung.
Class<Foo>
. Bằng cách đó, bạn có thể tạo một phiên bản mới, ví dụ, mà không cần truyền:Foo foo = clazz.newInstance();