有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

为了避免在运行时缺少Java泛型,将超类型绑定到子类实例

想象一种方法,例如

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));
}

共 (2) 个答案

  1. # 1 楼答案

    我建议您将该方法添加到Fruit并这样调用它

    interface Fruit {
        handleFruit();
    }
    
    public <F extends Fruit> Juice<F> makeJuiceFrom(Collection<F> fruits) {
        for (Fruit fruit: fruits) {
            fruit.handleFruit();
        }
        return ...
    }
    
  2. # 2 楼答案

    是的,您正在寻找visitor pattern

    Fruit的每个子类中编写一个方法:

    public void visit(Juice j) {
        j.handleFruit(this);
    }
    

    现在,您可以有不同类型的handleFruit(),并且this的静态类型是特定的(Apple/Orange/)根据visit()方法的实现类,将调用正确的方法

    Juice类中使用fruit.visit(this)调用