ลองพิจารณาตัวอย่างนี้ (โดยทั่วไปในหนังสือ OOP):
ฉันมีAnimal
ชั้นเรียนที่แต่ละคนAnimal
สามารถมีเพื่อนมากมาย
และ subclasses ชอบDog
, Duck
, Mouse
ฯลฯ ที่เพิ่มพฤติกรรมที่เฉพาะเจาะจงเช่นbark()
, quack()
ฯลฯ
นี่คือAnimal
คลาส:
public class Animal {
private Map<String,Animal> friends = new HashMap<>();
public void addFriend(String name, Animal animal){
friends.put(name,animal);
}
public Animal callFriend(String name){
return friends.get(name);
}
}
และนี่คือตัวอย่างข้อมูลบางส่วนที่มีการพิมพ์ดีดจำนวนมาก:
Mouse jerry = new Mouse();
jerry.addFriend("spike", new Dog());
jerry.addFriend("quacker", new Duck());
((Dog) jerry.callFriend("spike")).bark();
((Duck) jerry.callFriend("quacker")).quack();
มีวิธีใดบ้างที่ฉันสามารถใช้ generics สำหรับประเภทคืนเพื่อกำจัด typecasting เพื่อที่ฉันจะได้พูด
jerry.callFriend("spike").bark();
jerry.callFriend("quacker").quack();
นี่คือรหัสเริ่มต้นที่มีประเภทส่งคืนที่ถ่ายทอดไปยังเมธอดเนื่องจากพารามิเตอร์ที่ไม่เคยใช้
public<T extends Animal> T callFriend(String name, T unusedTypeObj){
return (T)friends.get(name);
}
มีวิธีคิดประเภทคืนที่รันไทม์โดยไม่ต้องใช้พารามิเตอร์พิเศษinstanceof
หรือไม่ หรืออย่างน้อยก็ผ่านคลาสประเภทแทนที่จะเป็นตัวอย่างแบบจำลอง
ฉันเข้าใจว่าข้อมูลทั่วไปใช้สำหรับการตรวจสอบเวลาแบบคอมไพล์ แต่มีวิธีแก้ปัญหาสำหรับเรื่องนี้หรือไม่?