1. ความเข้าใจอย่างง่ายเกี่ยวกับยาชื่อสามัญ
ข้อมูลทั่วไปเป็นคุณสมบัติใหม่ของ Java SE 1.5 สาระสำคัญของข้อมูลทั่วไปคือประเภทที่กำหนดพารามิเตอร์ ซึ่งหมายความว่าประเภทข้อมูลที่กำลังดำเนินการถูกระบุเป็นพารามิเตอร์ จุดที่นิยมคือ "ตัวแปรประเภท" ตัวแปรประเภทนี้สามารถใช้ในการสร้างคลาส อินเทอร์เฟซ และวิธีการ
วิธีที่ง่ายที่สุดในการทำความเข้าใจ Java Generics คือการมองว่าสิ่งเหล่านี้เป็นไวยากรณ์ที่สะดวกซึ่งช่วยให้คุณประหยัดเวลาในการดำเนินการส่ง Java บางอย่าง:
คัดลอกโค้ดดังต่อไปนี้: List<Apple> box = new ArrayList<Apple>();box.add(new Apple());Apple apple =box.get(0);
โค้ดข้างต้นแสดงออกอย่างชัดเจนมาก: box คือรายการที่มีอ็อบเจ็กต์ Apple เมธอด get ส่งคืนอินสแตนซ์ออบเจ็กต์ Apple และไม่จำเป็นต้องแปลงประเภทในกระบวนการนี้ หากไม่มียาชื่อสามัญ โค้ดด้านบนจะต้องเขียนดังนี้:
คัดลอกโค้ดดังต่อไปนี้: Apple apple = (Apple)box.get(0);
2. ความลำบากใจของยาชื่อสามัญ
ข้อได้เปรียบที่ใหญ่ที่สุดของยาชื่อสามัญคือให้ความปลอดภัยประเภทโปรแกรมและเข้ากันได้แบบย้อนหลัง แต่ก็มีจุดที่น่าอึดอัดใจด้วย นั่นคือต้องระบุประเภทของยาสามัญทุกครั้งที่กำหนด ไม่เพียงแต่จะให้ความรู้สึกที่ละเอียดเล็กน้อยเท่านั้น เพื่อระบุอย่างชัดเจน แต่ก็มีโปรแกรมเมอร์จำนวนมากที่ไม่คุ้นเคยกับยาชื่อสามัญ ดังนั้นพวกเขาจึงมักจะไม่สามารถให้พารามิเตอร์ประเภทที่ถูกต้องได้ ในตอนนี้ คอมไพเลอร์สามารถอนุมานประเภทพารามิเตอร์ของยาชื่อสามัญได้โดยอัตโนมัติ ซึ่งสามารถลดสถานการณ์ดังกล่าวและปรับปรุงโค้ดได้ ความสามารถในการอ่าน
3. การปรับปรุงการอนุมานประเภททั่วไปใน Java 7
ในเวอร์ชันก่อนหน้า เมื่อใช้ประเภททั่วไป คุณจะต้องเพิ่มประเภททั่วไปทั้งสองด้านเมื่อประกาศและกำหนดค่า ตัวอย่างเช่น:
คัดลอกรหัสดังต่อไปนี้: Map<String, String> myMap = new HashMap<String, String>();
คุณอาจคิดว่า: ฉันได้ระบุประเภทพารามิเตอร์แล้วเมื่อประกาศตัวแปร ทำไมฉันจึงต้องระบุอีกครั้งเมื่อเริ่มต้นวัตถุ โชคดีที่ใน Java SE 7 วิธีการนี้ได้รับการปรับปรุงแล้ว และตอนนี้คุณสามารถประกาศและกำหนดค่าโดยใช้คำสั่งต่อไปนี้:
คัดลอกโค้ดดังต่อไปนี้: Map<String, String> myMap = new HashMap<>(); //ให้ความสนใจกับ "<>" ที่ส่วนท้าย
ในคำสั่งนี้ คอมไพลเลอร์จะอนุมานประเภททั่วไปโดยอัตโนมัติเมื่อสร้างอินสแตนซ์ HashMap ตามประเภททั่วไปเมื่อมีการประกาศตัวแปร ขอย้ำอีกครั้งว่าให้ใส่ใจกับ "<>" หลัง HashMap ใหม่ การเพิ่ม "<>" เท่านั้นหมายถึงการอนุมานประเภทอัตโนมัติ มิฉะนั้นจะเป็น HashMap ประเภทที่ไม่ใช่ทั่วไป และจะได้รับเมื่อใช้คอมไพเลอร์ รวบรวมซอร์สโค้ด บันทึกคำเตือน
อย่างไรก็ตาม: การอนุมานประเภทของ Java SE 7 เมื่อสร้างอินสแตนซ์ทั่วไปนั้นมีจำกัด: เฉพาะเมื่อมีการประกาศประเภทที่กำหนดพารามิเตอร์ของตัวสร้างอย่างชัดเจนในบริบทเท่านั้น การอนุมานประเภทสามารถใช้ได้ มิฉะนั้นจะไม่ทำงาน ตัวอย่างเช่น: ตัวอย่างต่อไปนี้ไม่สามารถคอมไพล์ได้อย่างถูกต้องใน Java 7 (แต่สามารถคอมไพล์ได้ใน Java 8 ในขณะนี้ เนื่องจากประเภทของทั่วไปจะถูกอนุมานโดยอัตโนมัติตามพารามิเตอร์ของวิธีการ):
คัดลอกรหัสรหัสดังต่อไปนี้:
รายการ <String> รายการ = ArrayList ใหม่ <>();
list.add("A");// เนื่องจาก addAll คาดว่าพารามิเตอร์ประเภท Collection<? ขยาย String> คำสั่งต่อไปนี้จึงไม่สามารถผ่านได้
list.addAll(ArrayList ใหม่<>());
4. การปรับปรุงการอนุมานประเภททั่วไปใน Java 8
การอนุมานประเภทเป้าหมายมีสองประเภทหลักสำหรับยาสามัญใน Java 8:
1. สนับสนุนการอนุมานประเภทเป้าหมายทั่วไปผ่านบริบทของวิธีการ
2. รองรับการส่งผ่านอนุมานประเภททั่วไปไปยังวิธีสุดท้ายในห่วงโซ่การเรียกวิธี
ลองดูตัวอย่างจากเว็บไซต์อย่างเป็นทางการ:
คัดลอกรหัสรหัสดังต่อไปนี้:
รายการคลาส<E> {
คงที่ <Z> รายการ <Z> ไม่มี () { ... };
คงที่ <Z> รายการ <Z> ข้อเสีย (หัว Z, รายการ <Z> ส่วนท้าย) { ... };
หัว E() { ... }
-
ตามลักษณะของ JEP101 เราสามารถเขียนแบบนี้ได้เมื่อเรียกใช้เมธอดข้างต้น
คัดลอกรหัสรหัสดังต่อไปนี้:
//อนุมานประเภทของทั่วไปโดยอัตโนมัติผ่านพารามิเตอร์เป้าหมายของการกำหนดวิธีการ
รายการ<สตริง> l = List.nil();
//แทนที่จะแสดงประเภทที่ระบุ
//รายการ<String> l = รายการ.<String>ไม่มี();
//อนุมานประเภทของทั่วไปผ่านประเภทพารามิเตอร์วิธีการก่อนหน้า
List.cons(42, List.ไม่มี());
//แทนที่จะแสดงประเภทที่ระบุ
//List.cons(42, List.<จำนวนเต็ม>ไม่มี());
5. สรุป
ข้างต้นเป็นเนื้อหาคุณลักษณะของ JEP101 ในฐานะตัวแทนของภาษาคงที่ อาจกล่าวได้ว่า Java มีระบบประเภทที่หลากหลาย ปัญหาในการแปลงระหว่างประเภททำให้โปรแกรมเมอร์ Java ทุกคนต้องอนุมานประเภทโดยอัตโนมัติผ่านคอมไพเลอร์สามารถบรรเทาปัญหาการแปลงประเภทที่ซับซ้อนเกินไปได้เล็กน้อย แม้ว่าจะเป็นการปรับปรุงเล็กน้อย แต่ก็ส่งผลกระทบอย่างมากต่อโปรแกรมเมอร์ของเราที่เขียนโค้ดทุกวัน อย่างน้อยพวกเขาจะรู้สึกมีความสุขมากขึ้น ~~ บางทีใน Java 9 เราจะได้รับ var ประเภทสากล เช่น js หรือภาษาไดนามิกบางภาษา ของสกาล่าก็ประมาณนั้น^_^