在运行时解决缺少 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)
调用。
想象一个方法,例如
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)
调用。