2013-02-28 76 views
8

Tôi cần sử dụng sự phản chiếu trong java. Tôi hiểu rằng Class clazz tạo một biến thể hiện một đối tượng Class. Tuy nhiên, tôi đang cố gắng tham chiếu một đối tượng Class từ một String bằng phương pháp forName("aClassName"). IDE của tôi (Eclipse), dường như thích ký hiệu Class<?> clazz để khai báo biến. Tôi đã thấy ký hiệu này nhiều lần ở nơi khác. Điều đó có nghĩa là gì?Sự khác nhau giữa Class clazz và Class <?> clazz trong java là gì?

Chỉnh sửa: Đã xóa tham chiếu đến toán tử bậc ba vì nó không liên quan đến câu hỏi này.

+2

Cách này liên quan đến một toán tử bậc ba? Không có toán tử nào ở đây. –

+0

Trong ngữ cảnh này không phải là toán tử bậc ba, một ký tự đại diện không liên kết. – Perception

Trả lời

22

Classloại thô - về cơ bản đây là loại chung mà bạn đang xử lý như thể bạn chưa biết về generics.

Class<?> là một kiểu generic sử dụng một cởi wildcard - nó về cơ bản có nghĩa là "Class<Foo> đối với một số loại Foo, nhưng tôi không biết gì".

Tương tự như vậy bạn có thể có ký tự đại diện với giới hạn:

  • Class<? extends InputStream> có nghĩa là "Class<Foo> đối với một số loại Foo, nhưng tôi không biết điều gì miễn là nó là InputStream hoặc một lớp con"

  • Class<? super InputStream> có nghĩa là "Class<Foo> đối với một số loại Foo, nhưng tôi không biết điều gì miễn là nó là InputStream hoặc một siêu lớp"

Xem thêm các Java Generics FAQ cho một nhiều biết thêm thông tin:

Và Language Specification Java:

Đặc biệt, từ các loại phần thô:

loại thô có liên quan chặt chẽ với các kí hiệu. Cả hai đều dựa trên các loại tồn tại. Các loại thô có thể được coi là các ký tự đại diện có các quy tắc kiểu cố tình không được xử lý, để tương tác với mã cũ. Trong lịch sử, các loại thô đứng trước ký tự đại diện; chúng được giới thiệu lần đầu tiên trong GJ, và được mô tả trong bài báo Làm cho tương lai an toàn cho quá khứ: Thêm Genericity vào Ngôn ngữ lập trình Java của Gilad Bracha, Martin Odersky, David Stoutamire và Philip Wadler, trong Kỷ yếu Hội nghị ACM về Object- Lập trình theo định hướng, Hệ thống, Ngôn ngữ và Ứng dụng (OOPSLA 98), tháng 10 năm 1998.

+0

Nhưng sau đó, về mặt kỹ thuật, không có sự khác biệt nào giữa một kiểu thô và một ký tự đại diện không liên kết, phải không? Tôi có nghĩa là, ngoài tránh cảnh báo trình biên dịch và có thể tăng khả năng đọc mã. – Gothmog

+1

@Gothmog: Có những trường hợp nó có thể ảnh hưởng đến trọng số và quá tải, do cách xử lý các loại thô (IIRC). –

+0

Cảm ơn Jon, đã đánh giá cao! –

0

Trong kiểu generic wildcard ? có nghĩa là "bất cứ điều gì lớp" (vì vậy Class<?> cũng giống như chỉ Class nhưng as type liệu parametrized chính xác).

2

Điều đầu tiên cần nhận ra là, trong trường hợp này, "?" KHÔNG phải là toán tử bậc ba, nhưng là một phần của việc thực hiện Generics của Java và chỉ ra rằng kiểu Class không được chỉ định, vì một số câu trả lời khác đã giải thích.

Để làm rõ câu hỏi về toán tử bậc ba, nó thực sự rất đơn giản.

Hãy tưởng tượng bạn đã sau câu lệnh if:

boolean correct = true; 
String message; 

if (correct) { 
    message = "You are correct."; 
} else { 
    message = "You are wrong."; 
} 

Bạn có thể viết lại điều đó với các nhà điều hành ternary (nghĩ về nó như các nhà điều hành if-else-shortcut):

message = (correct) ? "You are correct." : "You are wrong."; 

Tuy nhiên, tốt nhất là tránh toán tử bậc ba cho tất cả trừ các câu lệnh đơn giản nhất để cải thiện khả năng đọc mã của bạn.

+0

Tôi hiểu, tôi đã ấn tượng rằng '?' Luôn được gọi là toán tử bậc ba. Tôi thấy bây giờ điều này là không chính xác. Các toán tử ternary thường được sử dụng hay đây là một tính năng phổ biến hơn trong quá khứ? –

+0

Tôi sẽ nói rằng nó vẫn còn được sử dụng, nhưng nói chung là tránh. Tôi vẫn thấy nó hiển thị trong mã ngay bây giờ và sau đó, vì vậy nó là tốt để biết làm thế nào để đọc nó. Có những tình huống hiếm hoi trong đó có một tuyên bố ngắn gọn hơn làm cho nó rõ ràng hơn những gì đang xảy ra. Đó là về thời gian duy nhất tôi sẽ xem xét việc sử dụng nó hơn nếu/else. – yogaphil

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