【发布时间】:2017-02-17 14:04:52
【问题描述】:
我有以下sn-p,它工作正常。
public class Test {
public static void main(String[] args) {
App app = new App();
app.setHandler(Apple.class, new AppleHandler());
app.setHandler(Banana.class, new BananaHandler());
app.process(new Apple());
app.process(new Banana());
}
}
class Fruit {}
class Apple extends Fruit {}
class Banana extends Fruit {}
interface Handler<T extends Fruit> {
public void handle(T fruit);
}
class AppleHandler implements Handler<Apple> {
@Override
public void handle(final Apple fruit) {
System.out.println("This is an apple.");
}
}
class BananaHandler implements Handler<Banana> {
@Override
public void handle(final Banana fruit) {
System.out.println("This is a banana.");
}
}
class App {
Map<Class, Handler> handlerMap = new HashMap<>();
public void setHandler(Class clazz, Handler handler) {
handlerMap.put(clazz, handler);
}
public void process(Fruit fruit) {
Handler handler = handlerMap.get(fruit.getClass());
handler.handle(fruit);// HERE, how java convert Fruit object to concrete subclass object automatically?
}
}
我希望App 类以不同的方式处理不同的Fruit,所以我定义AppleHandler 来处理Apple 和BananaHandler 来处理Banana。 AppleHandler 和BananaHandler 都实现了一个通用接口Handler,它有一个通用方法handle。 handle 方法在App.process 方法中被赋予了一个Fruit 对象,具体的handle 方法将按预期被调用。当调用具体的handle 方法时,java 似乎自动将Fruit 对象转换为其真实类型。 java是如何实现的呢?
【问题讨论】:
-
你的问题是:Java是如何实现多态的?
-
@DavidChoweller,没有。我的问题是:java如何在调用具体句柄方法时将Fruit对象转换为Apple或Banana对象(这称为多态)?
标签: java generics interface polymorphism