У меня есть следующий фрагмент, и он отлично работает.Как общий метод в интерфейсе java конвертирует супер объект в конкретный объект подкласса?
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
метод присваивается объекту Fruit
в методе App.process
, а конкретный метод handle
будет вызываться, как ожидалось. Кажется, что java бросает объект Fruit
в его реальный тип автоматически при вызове бетона handle
. Как java достигает этого?
Вы вопрос: Как Java реализовать полиморфизм? –
@DavidChoweller, NO. Мой вопрос: как java конвертирует объект Fruit в объект Apple или Banana при вызове метода конкретной ручки (это называется полиморфизмом)? – expoter