สิ่งนี้เกิดขึ้นเป็นคำถามที่ฉันถามในการสัมภาษณ์เมื่อเร็ว ๆ นี้เนื่องจากมีบางสิ่งที่ผู้สมัครต้องการเห็นเพิ่มเข้าไปในภาษา Java โดยทั่วไปมักถูกระบุว่าเป็นความเจ็บปวดที่ Java ไม่ได้ทำให้เกิดชื่อสามัญแต่เมื่อถูกผลักดันผู้สมัครไม่สามารถบอกฉันได้ว่าสิ่งต่างๆที่เขาสามารถทำได้คือสิ่งเหล่านี้
เห็นได้ชัดว่าเนื่องจากชนิดดิบเป็นสิ่งที่อนุญาตใน Java (และการตรวจสอบที่ไม่ปลอดภัย) จึงเป็นไปได้ที่จะล้มล้าง generics และลงเอยด้วยสิ่งList<Integer>
นั้น (ตัวอย่าง) มีString
s อยู่จริง สิ่งนี้ชัดเจนว่าเป็นไปไม่ได้คือข้อมูลประเภท reified; แต่ต้องมีมากกว่านี้ !
ผู้คนสามารถโพสต์ตัวอย่างของสิ่งที่พวกเขาอยากทำจริงๆได้หรือไม่มี reified generics ฉันหมายถึงเห็นได้ชัดว่าคุณสามารถหาประเภทของ a List
at runtime ได้ แต่คุณจะทำอย่างไรกับมัน?
public <T> void foo(List<T> l) {
if (l.getGenericType() == Integer.class) {
//yeah baby! err, what now?
แก้ไข : การอัปเดตอย่างรวดเร็วสำหรับสิ่งนี้เนื่องจากคำตอบดูเหมือนส่วนใหญ่จะเกี่ยวข้องกับความจำเป็นในการส่งClass
เป็นพารามิเตอร์ (ตัวอย่างEnumSet.noneOf(TimeUnit.class)
) ฉันถูกมองมากขึ้นสำหรับบางสิ่งบางอย่างตามสายของที่นี้ก็เป็นไปไม่ได้ ตัวอย่างเช่น:
List<?> l1 = api.gimmeAList();
List<?> l2 = api.gimmeAnotherList();
if (l1.getGenericType().isAssignableFrom(l2.getGenericType())) {
l1.addAll(l2); //why on earth would I be doing this anyway?
findClass()
จะต้องละเว้นการกำหนดพารามิเตอร์ แต่defineClass()
ทำไม่ได้) และอย่างที่เราทราบกันดีว่าพลังที่ยึดเหนี่ยวความเข้ากันได้กลับมายิ่งใหญ่