Java สามารถปรับปรุงได้อย่างไรเพื่อไม่ต้องทำการลบประเภทอีกต่อไป?


16

การสอน Java อย่างเป็นทางการเกี่ยวกับข้อมูลทั่วไปอธิบายประเภทการลบและสาเหตุที่เพิ่มเข้าในคอมไพเลอร์:

เมื่อประเภททั่วไปเป็นอินสแตนซ์คอมไพเลอร์แปลประเภทเหล่านั้นโดยใช้เทคนิคที่เรียกว่าประเภทการลบ - กระบวนการที่คอมไพเลอร์ลบข้อมูลทั้งหมดที่เกี่ยวข้องกับพารามิเตอร์ประเภทและอาร์กิวเมนต์ประเภทภายในชั้นเรียนหรือวิธีการ การลบประเภททำให้แอปพลิเคชัน Java ที่ใช้ generics เพื่อรักษาความเข้ากันได้ของไบนารีกับไลบรารี Java และแอปพลิเคชันที่สร้างขึ้นก่อนหน้า generics

สิ่งนี้น่าจะเป็นวิธีปฏิบัติหรืออาจเป็นวิธีที่เจ็บปวดน้อยที่สุด อย่างไรก็ตามตอนนี้ข้อมูลทั่วไปได้รับการสนับสนุนอย่างกว้างขวางทั่วอุตสาหกรรมสิ่งที่สามารถทำได้เพื่อให้เราไม่จำเป็นต้องลบประเภท? มันเป็นไปได้โดยไม่จำเป็นต้องแบ่งความเข้ากันได้ย้อนหลังหรือถ้าเป็นไปได้มันเป็นจริงหรือไม่?

คำแถลงสุดท้ายในข้อความข้างต้นกลายเป็นการอ้างอิงตนเองหรือไม่? นั่นคือ: "การลบประเภทช่วยให้แอปพลิเคชัน Java ที่ใช้ generics เพื่อรักษาความเข้ากันได้ของไบนารีกับไลบรารี Java และแอปพลิเคชันที่สร้างขึ้นด้วยเวอร์ชัน Java ที่ดำเนินการลบประเภท"


1
ดวงอาทิตย์ 1.4 เป็น EOL'ed IBM ยังคงสนับสนุน 1.4 บนแพลตฟอร์ม

@ ThorbjørnRavnAndersen: และอย่างน้อยสำหรับแพลตฟอร์มที่อยู่ในห้องใต้ดินของพ่อฉันไม่มี 1.5
Jörg W Mittag

@ ThorbjørnRavnAndersenไม่เพียง แต่จะสามารถซื้อการสนับสนุนเสริมสำหรับ JVM รุ่นก่อนหน้าได้เช่นกัน ล่าสุดฉันได้ยินมาว่ามันค่อนข้างแพง
maple_shaft

1
พวกเราไม่มีใครมีลูกบอลคริสตัลดังนั้นจึงไม่สามารถตอบได้ บางทีมันอาจจะถูกเปิดใหม่ถ้าคุณใช้คำถามใหม่จากคำถาม "จะมี ... " ถึงคำถาม "สิ่งที่ต้องทำให้สำเร็จสำหรับ Type Erasure ที่จะแสดงใน Java รุ่นอนาคต"
maple_shaft

@ JörgWMittagนั้นจะเป็นแพลตฟอร์มที่ใช้จริงสำหรับการผลิตในปี 2012 หรือไม่?

คำตอบ:


7

จุดสิ้นสุดของชีวิตใช้กับ Java Development Toolkit และ Java Runtime Environment และเฉพาะรุ่น Oracle (Sun) แต่ไม่สามารถใช้กับแอปพลิเคชันที่เขียนโดยบุคคลที่สาม ความตั้งใจคือจะไม่ทำลายโค้ดที่เคยใช้กับ JVM ดังนั้นจึงไม่น่าที่ Java จะหยุดทำการลบประเภท

แน่นอน C # ยังแนะนำ generics ในรุ่นที่ใหม่กว่าในลักษณะที่เข้ากันได้แบบย้อนหลังโดยไม่ทำการลบประเภท แต่โดยทั่วไปแล้วมันหมายถึงการทำซ้ำคลาสคอลเลกชันทั้งหมด ซึ่งฉันคิดว่าเป็นสิ่งที่นักออกแบบ Java ไม่ต้องการทำและทำไมพวกเขาเลือกประเภทลบในตอนแรก หากไม่มีประเภทของค่าข้อดีของ generics ที่ไม่ถูกลบจะไม่ใช่เรื่องใหญ่


6
ทีม OpenJDK ได้พูดคุยเกี่ยวกับการมองหา Generics อีกครั้งกรอบเวลา ส่วนใหญ่มีแนวโน้มที่จะดูอย่างจริงจังในช่วงเวลาของ Java 9 และถ้าเป็นไปได้ทางเทคนิคส่งในกรอบเวลาของ Java 10 แต่นี่เป็นการบรรเทาอย่างจริงจังในส่วนของฉัน
Martijn Verburg

การลบประเภททำได้โดยคอมไพเลอร์ไม่ใช่ JVM การแนะนำยาชื่อสามัญ reified จะต้องรวบรวมใหม่และ JVM ใหม่ แต่สันนิษฐานว่าพวกเขาจะยังคงทำงานกับรหัสเก่า
Gabe

@Gabe: เห็นได้ชัดว่าพวกเขาจะได้รับการแนะนำในรุ่นใหม่ดังนั้นจะมีคอมไพเลอร์ใหม่และ JVM ใหม่ แต่มันก็ต้องมีการทำซ้ำส่วนที่สำคัญของไลบรารีมาตรฐานเพราะมันจะต้องมากกว่ารุ่นทั่วไปสำหรับรหัสใหม่และรุ่นที่ไม่ใช่ทั่วไปสำหรับความเข้ากันได้ย้อนหลัง .NET ทำเช่นนั้นในเวอร์ชัน 2.0, Java หลีกเลี่ยงด้วยการลบออก .NET มีประเภทค่า (struct) และการสนับสนุนชั้นหนึ่งสำหรับพวกเขาตัดการลบประเภท Java ไม่ได้ดังนั้นแรงกดดันสำหรับการให้ข้อมูลทั่วไปมีขนาดเล็กกว่ามาก
Jan Hudec

ม.ค. : ฉันแค่แสดงความคิดเห็นเกี่ยวกับความจริงที่ว่าการใช้ยาชื่อสามัญไม่ได้หมายความว่ารหัสเก่าทั้งหมดเสีย ฉันยังอยากจะเพิ่มว่าอาจจะทำให้แน่นอนปริมาณงานที่มีประสิทธิภาพมากขึ้นกว่าในปัจจุบันList<int> List<Integer>
Gabe

@Gabe: เราไม่เห็นด้วยในเรื่องนั้น ฉันแค่อยากจะสังเกตข้อเสียเปรียบหลัก
Jan Hudec
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.