想像一下这样的方法

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/

10-09 04:29