在运行时解决缺少 Java 泛型的问题,将超类型绑定到子类实例

Getting around lack of Java generics at runtime, bind a super type to a subclass instance

想象一个方法,例如

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

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

interface Fruit {
    handleFruit();
}

public <F extends Fruit> Juice<F> makeJuiceFrom(Collection<F> fruits) {
    for (Fruit fruit: fruits) {
        fruit.handleFruit();
    }
    return ...
}

是的,您正在寻找 visitor pattern

Fruit的每个子class中写一个方法:

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

现在,你可以有不同类型的handleFruit(),而this的静态类型是具体的(Apple/Orange/...) visit() 方法的实现 class,将调用正确的方法。

从您的 Juice class 使用 fruit.visit(this) 调用。