ฉันต้องการลองคำตอบจาก @DerMike เพื่ออธิบาย:
ก่อนอื่นให้ลบประเภทไม่ได้หมายความว่า JDK กำจัดข้อมูลประเภทที่รันไทม์ เป็นวิธีการอนุญาตให้มีการตรวจสอบประเภทเวลาคอมไพล์และความเข้ากันได้ของชนิดรันไทม์เพื่ออยู่ร่วมกันในภาษาเดียวกัน เมื่อบล็อกของรหัสนี้แสดงถึง JDK จะเก็บข้อมูลประเภทที่ถูกลบ - มันไม่ได้เกี่ยวข้องกับการคัดสรรและสิ่งต่างๆ
ประการที่สองนี้ให้ข้อมูลประเภททั่วไปกับคลาสทั่วไปหนึ่งระดับขึ้นไปของการสืบทอดจากประเภทคอนกรีตที่กำลังตรวจสอบ - นั่นคือคลาสนามธรรมหลักที่มีพารามิเตอร์ประเภททั่วไปสามารถค้นหาประเภทคอนกรีตที่สอดคล้องกับพารามิเตอร์ประเภทสำหรับการใช้งานที่เป็นรูปธรรมของตัวเอง ที่สืบทอดโดยตรงจากมัน ถ้าคลาสนี้ไม่ใช่แบบนามธรรมและอินสแตนซ์หรือการใช้งานที่เป็นรูปธรรมลดลงสองระดับสิ่งนี้จะไม่ทำงาน (ถึงแม้จะมีเล่ห์เหลี่ยมนิดหน่อยก็สามารถทำให้มันใช้ได้กับจำนวนที่กำหนดไว้ล่วงหน้าเกินกว่าหนึ่งระดับหรือต่ำกว่าระดับต่ำสุด ด้วยพารามิเตอร์ประเภท X ทั่วไปและอื่น ๆ )
อย่างไรก็ตามเพื่ออธิบาย นี่คือรหัสอีกครั้งโดยแยกออกเป็นบรรทัดเพื่อความสะดวกในการอ้างอิง:
1 # class genericParameter0OfThisClass =
2 # (คลาส)
3 # ((ประเภทพารามิเตอร์)
4 # getClass ()
5 # .getGenericSuperclass ())
6 # .getActualTypeArguments () [0];
ให้ 'เรา' เป็นคลาสนามธรรมที่มีประเภททั่วไปที่มีรหัสนี้ การอ่านข้างในนี้โดยสังเขป:
- บรรทัดที่ 4 ได้รับอินสแตนซ์ของคลาสคลาสคอนกรีตปัจจุบัน สิ่งนี้ระบุประเภทที่เป็นรูปธรรมของผู้สืบทอดในทันที
- บรรทัดที่ 5 ได้รับ supertype ของคลาสนั้นเป็นประเภท นี่คือเรา. เนื่องจากเราเป็นประเภทพารามิเตอร์เราจึงสามารถโยนตัวเองไปที่ ParameterizedType (บรรทัดที่ 3) ได้อย่างปลอดภัย ที่สำคัญคือเมื่อ Java กำหนดวัตถุประเภทนี้จะใช้ข้อมูลประเภทที่มีอยู่ในเด็กที่จะเชื่อมโยงข้อมูลประเภทกับพารามิเตอร์ประเภทของเราในอินสแตนซ์ ParameterizedType ใหม่ ดังนั้นตอนนี้เราสามารถเข้าถึงประเภทคอนกรีตสำหรับข้อมูลทั่วไปของเรา
- Line 6 ได้รับอาเรย์ของประเภทที่แมปไว้ในข้อมูลทั่วไปของเราตามลำดับที่ประกาศไว้ในรหัสชั้นเรียน สำหรับตัวอย่างนี้เราดึงพารามิเตอร์แรกออกมา สิ่งนี้กลับมาเป็นประเภท
- บรรทัด 2 ปลดเปลื้อง Type สุดท้ายที่ส่งคืนไปยัง Class สิ่งนี้ปลอดภัยเพราะเรารู้ว่าพารามิเตอร์ประเภททั่วไปประเภทใดที่สามารถใช้และสามารถยืนยันได้ว่าพวกเขาทั้งหมดจะเป็นคลาส (ฉันไม่แน่ใจว่าใน Java หนึ่งจะไปเกี่ยวกับการรับพารามิเตอร์ทั่วไปที่ไม่มีอินสแตนซ์ Class เกี่ยวข้องกับมันจริง ๆ )
... และมันก็สวยมาก ดังนั้นเราจึงผลักดันข้อมูลประเภทจากการนำไปใช้ที่เป็นรูปธรรมของเราเองและใช้เพื่อเข้าถึงตัวจัดการคลาส เราสามารถเพิ่ม getGenericSuperclass () และเพิ่มสองระดับหรือกำจัด getGenericSuperclass () และรับค่าสำหรับตัวเราในรูปแบบคอนกรีต (ข้อแม้: ฉันยังไม่ได้ทดสอบสถานการณ์เหล่านี้พวกเขายังไม่ได้มาสำหรับฉัน)
มันจะยุ่งยากหากว่าเด็กที่เป็นรูปธรรมของคุณมีจำนวนฮ็อพออกไปโดยพลการหรือหากคุณเป็นรูปธรรมและไม่เป็นที่สิ้นสุดและโดยเฉพาะอย่างยิ่งหากคุณคาดหวังว่าเด็ก ๆ แต่โดยปกติคุณสามารถออกแบบรอบการพิจารณาเหล่านั้นเพื่อให้ได้รับมากที่สุด
หวังว่านี่จะช่วยใครซักคน! ฉันรู้จักโพสต์นี้โบราณ ฉันอาจจะตัดคำอธิบายนี้และเก็บไว้สำหรับคำถามอื่น ๆ