ฉันคิดว่าหัวข้อ Generics Tutorial นี้อธิบายถึงสถานการณ์ (สิ่งที่ฉันให้ความสำคัญ):
"คุณต้องตรวจสอบให้แน่ใจว่า API ทั่วไปไม่ได้ถูก จำกัด อย่างเกินจริงมันต้องดำเนินการต่อเพื่อสนับสนุนสัญญาเดิมของ API ลองพิจารณาตัวอย่างจาก java.util.Collection อีกครั้ง API ก่อนทั่วไปดูเหมือนว่า:
interface Collection {
public boolean containsAll(Collection c);
...
}
ความพยายามที่ไร้เดียงสาในการสร้างมันคือ:
interface Collection<E> {
public boolean containsAll(Collection<E> c);
...
}
แม้ว่าวิธีนี้จะปลอดภัย แต่ก็ไม่เป็นไปตามสัญญาเดิมของ API
เมธอด containAll () ทำงานกับการรวบรวมขาเข้าชนิดใดก็ได้ มันจะประสบความสำเร็จก็ต่อเมื่อคอลเลกชันที่เข้ามามีจริงๆของ E เท่านั้น แต่:
- ประเภทคงที่ของคอลเลกชันที่เข้ามาอาจแตกต่างกันอาจเป็นเพราะผู้โทรไม่ทราบประเภทที่ถูกต้องของคอลเลกชันที่ถูกส่งผ่านหรืออาจเป็นเพราะมันเป็นคอลเลกชัน <S> ที่ S เป็นชนิดย่อยของ E
- มันถูกต้องตามกฎหมายอย่างสมบูรณ์แบบในการโทรที่มีAllAll () ด้วยชุดของประเภทที่แตกต่างกัน รูทีนควรทำงานส่งคืนค่าเท็จ "