ฉันอ่านเกี่ยวกับการลบประเภทของ Java บนเว็บไซต์ของออราเคิล
การลบประเภทเกิดขึ้นเมื่อใด ในเวลารวบรวมหรือรันไทม์? เมื่อชั้นเรียนถูกโหลด? เมื่อชั้นเรียนถูกยกตัวอย่าง?
มีไซต์จำนวนมาก (รวมถึงบทแนะนำอย่างเป็นทางการที่กล่าวถึงข้างต้น) พูดว่าการลบประเภทเกิดขึ้นในเวลารวบรวม หากข้อมูลประเภทจะถูกลบออกอย่างสมบูรณ์ในเวลารวบรวมวิธีการตรวจสอบความเข้ากันได้ของประเภท JDK เมื่อวิธีการใช้ข้อมูลทั่วไปจะถูกเรียกโดยไม่มีข้อมูลประเภทหรือข้อมูลประเภทที่ไม่ถูกต้อง?
ลองพิจารณาตัวอย่างต่อไปนี้: ระดับ Say มีวิธีการที่A
empty(Box<? extends Number> b)
เรารวบรวมและรับไฟล์ชั้นเรียนA.java
A.class
public class A {
public static void empty(Box<? extends Number> b) {}
}
public class Box<T> {}
ตอนนี้เราสร้างชั้นอื่นB
ซึ่งเรียกวิธีการที่empty
มีข้อโต้แย้งที่ไม่แปร empty(new Box())
(ชนิดดิบ): ถ้าเรารวบรวมB.java
กับA.class
ใน classpath ที่ javac เป็นพอสมาร์ทที่จะยกระดับการเตือน ดังนั้นจึงA.class
มีข้อมูลประเภทที่เก็บอยู่ในนั้น
public class B {
public static void invoke() {
// java: unchecked method invocation:
// method empty in class A is applied to given types
// required: Box<? extends java.lang.Number>
// found: Box
// java: unchecked conversion
// required: Box<? extends java.lang.Number>
// found: Box
A.empty(new Box());
}
}
ฉันเดาว่าการลบประเภทนั้นจะเกิดขึ้นเมื่อโหลดคลาส แต่เป็นเพียงการเดา แล้วจะเกิดอะไรขึ้น