แนวคิดที่คุณเริ่มอ้างถึงในคำถามของคุณเรียกว่าcovariant กลับประเภท
Covariant return types ทำงานได้เพราะวิธีการหนึ่งควรจะคืนค่าอ็อบเจกต์บางประเภทและเมธอดการแทนที่อาจส่งคืนคลาสย่อยของมัน บนพื้นฐานของกฎ Subtyping ของภาษาเช่น Java ถ้าS
เป็นชนิดย่อยของT
แล้วทุกที่ที่ปรากฏเราสามารถผ่านการT
S
เช่นนี้จะปลอดภัยในการส่งคืนS
เมื่อแทนที่เมธอดที่คาดT
ไว้
ข้อเสนอแนะของคุณเพื่อยอมรับว่าการแทนที่เมธอดใช้อาร์กิวเมนต์ที่เป็นชนิดย่อยของเมธอดที่ถูกร้องขอโดยเมธอด overridden มีความซับซ้อนมากขึ้นเนื่องจากนำไปสู่ความไม่แน่นอนในระบบพิมพ์
ด้วยมือข้างหนึ่งตามกฎการพิมพ์ย่อยที่กล่าวถึงข้างต้นส่วนใหญ่แล้วมันใช้ได้กับสิ่งที่คุณต้องการจะทำแล้ว ตัวอย่างเช่น
interface Hunter {
public void hunt(Animal animal);
}
ไม่มีสิ่งใดขัดขวางการใช้งานในชั้นเรียนนี้จากการรับสัตว์ทุกชนิดมันเป็นไปตามเกณฑ์ในคำถามของคุณ
แต่สมมติว่าเราสามารถแทนที่วิธีนี้ตามที่คุณแนะนำ:
class MammutHunter implements Hunter {
@Override
public void hunt(Mammut animal) {
}
}
นี่คือส่วนที่ตลกตอนนี้คุณสามารถทำได้:
AnimalHunter hunter = new MammutHunter();
hunter.hunt(new Bear()); //Uh oh
ตามอินเทอร์เฟซสาธารณะของAnimalHunter
คุณควรจะสามารถล่าสัตว์ใด ๆ แต่ตามการใช้งานของMammutHunter
คุณคุณยอมรับเฉพาะMammut
วัตถุ ดังนั้นวิธี overriden ไม่ตอบสนองต่อส่วนต่อประสานสาธารณะ เราเพิ่งทำลายความสมบูรณ์ของระบบประเภทที่นี่
คุณสามารถใช้สิ่งที่คุณต้องการโดยใช้ข้อมูลทั่วไป
interface AnimalHunter<T extends Animal> {
void hunt(T animal);
}
จากนั้นคุณสามารถกำหนด MammutHunter ของคุณ
class MammutHunter implements AnimalHunter<Mammut> {
void hunt(Mammut m){
}
}
และการใช้ความแปรปรวนร่วมแบบทั่วไปและความแปรปรวนร่วมคุณสามารถผ่อนคลายกฎในความโปรดปรานของคุณเมื่อจำเป็น ตัวอย่างเช่นเราสามารถตรวจสอบให้แน่ใจว่านักล่าสัตว์เลี้ยงลูกด้วยนมสามารถล่าสัตว์ได้ในบริบทที่กำหนด:
AnimalHunter<? super Feline> hunter = new MammalHunter();
hunter.hunt(new Lion());
hunter.hunt(new Puma());
เผื่อว่าการดำเนินการMammalHunter
AnimalHunter<Mammal>
ในกรณีนี้จะไม่ได้รับการยอมรับ:
hunter.hunt(new Mammut()):
แม้เมื่อสัตว์เลี้ยงลูกด้วยนมเป็นสัตว์เลี้ยงลูกด้วยนมก็จะไม่ได้รับการยอมรับเนื่องจากข้อ จำกัด ในประเภทที่แตกต่างที่เราใช้อยู่ที่นี่ ดังนั้นคุณยังสามารถออกกำลังกายเพื่อควบคุมสิ่งต่าง ๆ เพื่อทำสิ่งที่คุณกล่าวถึง