คำถามของฉันมีดังข้างต้น ขออภัยมันอาจจะซ้ำกัน แต่ฉันไม่พบตัวอย่าง<?>
ในตอนท้าย
ทำไมคุณไม่ใช้Class
เป็นพารามิเตอร์
คำถามของฉันมีดังข้างต้น ขออภัยมันอาจจะซ้ำกัน แต่ฉันไม่พบตัวอย่าง<?>
ในตอนท้าย
ทำไมคุณไม่ใช้Class
เป็นพารามิเตอร์
คำตอบ:
Class
เป็นคลาสที่ปรับพารามิเตอร์ได้ดังนั้นคุณสามารถใช้ไวยากรณ์Class<T>
โดยที่T
เป็นประเภทได้ ด้วยการเขียนแสดงClass<?>
ว่าคุณกำลังประกาศClass
ออบเจ็กต์ที่สามารถเป็นประเภทใดก็ได้ ( ?
เป็นสัญลักษณ์แทน) Class
ประเภทคือประเภทที่มีเมตาข้อมูลเกี่ยวกับระดับหนึ่ง
เป็นแนวทางปฏิบัติที่ดีเสมอในการอ้างถึงประเภททั่วไปโดยการระบุประเภทเฉพาะของเขาโดยใช้Class<?>
ว่าคุณปฏิบัติตามแนวทางปฏิบัตินี้ (คุณทราบว่าClass
สามารถกำหนดพารามิเตอร์ได้) แต่คุณไม่ได้ จำกัด พารามิเตอร์ให้มีประเภทเฉพาะ
ข้อมูลอ้างอิงเกี่ยวกับ Generics และ Wildcards: http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html
การอ้างอิงเกี่ยวกับClass
วัตถุและการสะท้อน (คุณลักษณะของภาษา Java ที่ใช้ในการไตร่ตรองตัวเอง): https://www.oracle.com/technetwork/articles/java/javareflection-1536171.html
Class
โดยไม่มีประเภทคืออะไร? ดูเหมือนจะเป็นตัวแทนของสิ่งเดียวกัน
?
สัญลักษณ์แทน" . หากคุณไม่ให้สัญลักษณ์แทนคอมไพลเลอร์จะถือว่าคุณลืมประเภทหรือไม่ทราบว่าคลาสเป็นแบบทั่วไปและจะเตือนคุณเกี่ยวกับเรื่องนี้
Class<?>
Class
ไม่สามารถส่งผ่านไปยังอาร์กิวเมนต์ชนิดเป็น Class<?>
ดังนั้นClass<?>
มีความสะดวกมากขึ้นสำหรับทุกสถานการณ์
นี่<?>
คือสัตว์ร้าย มันมักจะนำไปสู่ความสับสนและข้อผิดพลาดเพราะเมื่อคุณเห็นมันเป็นครั้งแรกแล้วคุณจะเริ่มเชื่อ<?>
เป็นสัญลักษณ์แทนสำหรับประเภทจาวาใด ๆ ซึ่งก็.. ไม่จริง. <?>
เป็นประเภทที่ไม่รู้จักความแตกต่างเล็กน้อยและน่ารังเกียจ
ไม่เป็นปัญหาเมื่อใช้กับClass
. ทั้งสองบรรทัดทำงานและคอมไพล์:
Class anyType = String.class;
Class <?> theUnknownType = String.class;
แต่ - ถ้าเราเริ่มใช้กับคอลเลกชั่นเราจะเห็นข้อผิดพลาดในการคอมไพล์ไทม์แปลก ๆ
List<?> list = new ArrayList<Object>(); // ArrayList<?> is not allowed
list.add("a String"); // doesn't compile ...
ของเราList<?>
ไม่ใช่คอลเลกชันที่เหมาะสำหรับวัตถุทุกประเภท สามารถจัดเก็บได้เพียงประเภทเดียวเท่านั้น: "ประเภทที่ไม่รู้จัก" ลึกลับ ซึ่งไม่ใช่ประเภทจริงอย่างแน่นอน.
หมายความว่าการอ้างอิงคลาสของคุณสามารถถือการอ้างอิงถึงคลาสออบเจ็กต์ใดก็ได้
โดยพื้นฐานแล้วมันเหมือนกับ "Class" แต่คุณกำลังแสดงให้คนอื่น ๆ ที่อ่านโค้ดของคุณซึ่งคุณไม่ลืมเกี่ยวกับ generics คุณแค่ต้องการข้อมูลอ้างอิงที่สามารถเก็บวัตถุ Class ใดก็ได้
Bruce Eckel คิดใน Java:
ใน Java SE5 Class <?> เป็นที่ต้องการมากกว่า Class ธรรมดาแม้ว่าจะเทียบเท่าและ Class ธรรมดาอย่างที่คุณเห็นจะไม่สร้างคำเตือนของคอมไพเลอร์ ประโยชน์ของคลาส <?> คือบ่งบอกว่าคุณไม่ได้ใช้แค่การอ้างอิงคลาสแบบไม่เจาะจงโดยบังเอิญหรือจากความไม่รู้ คุณเลือกเวอร์ชันที่ไม่เฉพาะเจาะจง
มันเป็นตัวอักษรทั่วไป หมายความว่าคุณไม่ทราบประเภทของคลาสที่Class
อินสแตนซ์นี้เป็นตัวแทน แต่คุณยังคงใช้เวอร์ชันทั่วไป
Class<Foo>
ถ้าคุณรู้ว่าชั้นเรียนที่คุณต้องการใช้ ด้วยวิธีนี้คุณสามารถสร้างอินสแตนซ์ใหม่ตัวอย่างเช่นโดยไม่ต้องแคสต์:Foo foo = clazz.newInstance();
ในชื่อสามัญประเภทที่ไม่รู้จักจะแสดงด้วยอักขระตัวแทน "?" อ่านตัวอย่างเป็นทางการได้ที่นี่
นั่นหมายถึงคลาสที่มีประเภทอะไรก็ได้ (ไม่ทราบ)
คุณควรอ่านบทช่วยสอน java generics เพื่อทำความเข้าใจให้ดีขึ้น