想像一下这样的方法
public <F extends Fruit> Juice<F> makeJuiceFrom(Collection<F> fruits) {
for (F fruit: fruits) {
handleFruit(fruit);
}
return ...
}
现在我想重载handleFruit方法,以便它处理不同类型的水果,例如
void handleFruit(Apple), void handleFruit(Orange)
橘子和苹果在其中延伸出果实。
但是,现在我当然被迫纠正硬编码绑定的方法:
private void HandleFruit(Fruit fruit) {
if (Fruit instanceof Apple)
handleFruit(((Apple)fruit));
else if (...)
...
}
有什么办法可以动态绑定它:
private void handleFruit(Fruit fruit) {
handleFruit(((fruit.getType)fruit));
}
最佳答案
是的,您正在寻找visitor pattern。
在Fruit
的每个子类中编写一个方法:
public void visit(Juice j) {
j.handleFruit(this);
}
现在,您可以拥有不同类型的
handleFruit()
,并且根据this
方法的实现类,Apple
的静态类型是特定的(Orange
/ visit()
/ ...),然后将调用正确的方法。从
fruit.visit(this)
类中调用Juice
。关于java - 解决运行时缺少Java泛型的问题,将父类(super class)型绑定(bind)到子类实例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28718130/