มีปัญหากับ
List<String> list = new LinkedList();
คือว่าทางด้านซ้ายมือคุณกำลังใช้ทั่วไปประเภทList<String>
ที่อยู่ทางด้านขวาคุณกำลังใช้วัตถุดิบLinkedList
ประเภท ประเภท Raw ใน Java นั้นมีอยู่เพียงเพื่อความเข้ากันได้กับโค้ด pre-generics และไม่ควรใช้ในรหัสใหม่เว้นแต่คุณจะต้อง
ตอนนี้ถ้า Java มี generics ตั้งแต่เริ่มต้นและไม่มีประเภทเช่นLinkedList
ที่สร้างขึ้นก่อนที่จะมี generics ก็อาจจะทำให้มันเพื่อให้นวกรรมิกสำหรับประเภททั่วไป infers พารามิเตอร์ประเภทจากด้านซ้ายโดยอัตโนมัติ - มือข้างที่มอบหมายถ้าเป็นไปได้ แต่มันก็ไม่ได้และมันจะต้องรักษาประเภทดิบและประเภททั่วไปที่แตกต่างกันสำหรับความเข้ากันได้ย้อนหลัง นั่นทำให้พวกเขาจำเป็นต้องสร้างความแตกต่างเล็กน้อยแต่ก็สะดวกสบายเท่า ๆ กันในการประกาศตัวอย่างใหม่ของวัตถุทั่วไปโดยไม่ต้องทำพารามิเตอร์ชนิดซ้ำ ... ผู้ประกอบการเพชร
เท่าที่ตัวอย่างดั้งเดิมของคุณList<String> list = new LinkedList()
คอมไพเลอร์สร้างคำเตือนสำหรับการมอบหมายนั้นเพราะมันจะต้อง พิจารณาสิ่งนี้:
List<String> strings = ... // some list that contains some strings
// Totally legal since you used the raw type and lost all type checking!
List<Integer> integers = new LinkedList(strings);
ยาสามัญมีอยู่เพื่อให้การป้องกันเวลารวบรวมจากการทำสิ่งที่ผิด ในตัวอย่างด้านบนการใช้ประเภท raw หมายความว่าคุณไม่ได้รับการป้องกันนี้และจะได้รับข้อผิดพลาดในขณะทำงาน นี่คือเหตุผลที่คุณไม่ควรใช้ชนิดดิบ
// Not legal since the right side is actually generic!
List<Integer> integers = new LinkedList<>(strings);
อย่างไรก็ตามผู้ประกอบการเพชรอนุญาตให้กำหนดด้านขวามือของการกำหนดให้เป็นอินสแตนซ์ทั่วไปที่แท้จริงด้วยพารามิเตอร์ประเภทเดียวกันกับด้านซ้าย ... โดยไม่ต้องพิมพ์พารามิเตอร์เหล่านั้นอีกครั้ง จะช่วยให้คุณรักษาความปลอดภัยของยาชื่อสามัญที่มีเกือบความพยายามเดียวกับการใช้ชนิดดิบ
ฉันคิดว่าสิ่งสำคัญที่ต้องเข้าใจคือประเภทดิบ (ไม่มี<>
) ไม่สามารถได้รับการปฏิบัติเช่นเดียวกับประเภททั่วไป เมื่อคุณประกาศประเภท raw คุณจะไม่ได้รับสิทธิประโยชน์และการตรวจสอบประเภท generics คุณต้องจำไว้ว่าgenerics เป็นจุดประสงค์ทั่วไปของภาษาจาวา ... พวกเขาไม่เพียง แต่ใช้กับผู้สร้าง no-arg ของCollection
s!