Xem xét ví dụ này (điển hình trong sách OOP):
Tôi có một Animal
lớp học, nơi mỗi người Animal
có thể có nhiều bạn bè.
Và các lớp con thích Dog
, Duck
, Mouse
vv mà thêm hành vi cụ thể như bark()
, quack()
vv
Đây là Animal
lớp học:
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);
}
}
Và đây là một số đoạn mã với nhiều kiểu chữ:
Mouse jerry = new Mouse();
jerry.addFriend("spike", new Dog());
jerry.addFriend("quacker", new Duck());
((Dog) jerry.callFriend("spike")).bark();
((Duck) jerry.callFriend("quacker")).quack();
Có cách nào tôi có thể sử dụng thuốc generic cho kiểu trả về để loại bỏ kiểu chữ không, để tôi có thể nói
jerry.callFriend("spike").bark();
jerry.callFriend("quacker").quack();
Đây là một số mã ban đầu với kiểu trả về được truyền đến phương thức dưới dạng tham số không bao giờ được sử dụng.
public<T extends Animal> T callFriend(String name, T unusedTypeObj){
return (T)friends.get(name);
}
Có cách nào để tìm ra kiểu trả về trong thời gian chạy mà không sử dụng tham số phụ instanceof
không? Hoặc ít nhất bằng cách vượt qua một lớp của loại thay vì một ví dụ giả.
Tôi hiểu rằng generic là để kiểm tra kiểu thời gian biên dịch, nhưng có một cách giải quyết cho việc này không?