Lớp <?> Có nghĩa là gì trong Java?


Câu trả lời:


109

Classlà một lớp có thể tham số hóa, do đó bạn có thể sử dụng cú pháp Class<T>trong đó Tlà 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 Classtype 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 Classlà 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


7
Lợi ích của việc làm này chỉ đơn giản là sử dụng Classmà không cần một loại? Họ dường như đại diện cho điều tương tự.
tro999

1
Tôi nghĩ rằng toàn bộ quan điểm chung là bạn không biết loại trả trước. Nếu không, bạn sẽ chỉ định nghĩa một hàm để sử dụng một loại lớp cụ thể cho tham số. Dấu hỏi này vẫn không có ý nghĩa.
Brain2000

5
Không có lợi ích nào khác ngoài việc bạn nói với trình biên dịch rằng "Tôi biết đây là một lớp chung, nhưng tôi không biết hoặc không quan tâm đến loại thực tế, vì vậy thay vì đưa ra một loại cụ thể tôi sẽ đưa ra ?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ó.
Kayaman

1
Tương đương với Kotlin là gìClass<?>
JGuo

chỉ đơn giản là Classkhô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.
petertc

72

Đâ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. <?>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.


8

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


1
Câu trích dẫn nói "Lớp <?> Được ưa thích hơn Lớp đơn giản" và "Lợi ích của Lớp <?>". Có vẻ như blockquote không đồng ý với dấu ngoặc nhọn.
Filip

1
Nó cần phải được trốn thoát. Đã sửa lỗi ngay: P
Sami Kuhmonen

5

Đó là một Generics chữ. Điều đó có nghĩa là bạn không biết loại lớp mà Classthể hiện này đại diện, nhưng bạn vẫn đang sử dụng phiên bản chung.

  • nếu bạn biết lớp học, bạn sẽ sử dụng 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();
  • nếu bạn hoàn toàn không sử dụng thuốc generic, bạn sẽ nhận được một cảnh báo ít nhất (và không sử dụng thuốc generic thường không được khuyến khích vì nó có thể dẫn đến các tác dụng phụ khó phát hiện)

5

Trong thuốc generic, một loại không xác định được biểu thị bằng ký tự đại diện "?". Đọc ở đây để ví dụ chính thức.


3

Điều đó có nghĩa là một Class với một loại bất cứ thứ gì (chưa biết).

Bạn nên đọc hướng dẫn khái quát java để hiểu rõ hơn về nó

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.