Перегрузка метода Java вызвана интерфейсом - PullRequest
5 голосов
/ 18 июля 2011

Я уверен, что это элементарно, но я в тупике.Пример сильно упрощен, но сводится к следующему.У меня есть некоторые перегруженные методы в классе, например:

public void build(MyImplOneOfAnInterface item);
public void build(MyImplTwoOfAnInterface item);

Затем у меня есть другой метод, который выполняет следующее:

public void buildIt(MyInterface item) {
     build(item);
}

Когда я пытаюсь скомпилировать, я получаю следующую ошибку:

не может найти символ

Это связано с тем, что JVM не может определить реализацию интерфейса во время компиляции, чтобы она знала, какой перегруженный метод вызывать.

Как это можно решить во время выполнения?Кажется, что JVM должна быть в состоянии понять это.

PS: я не хочу определять метод, который принимает интерфейс в качестве аргумента, а затем выполняет несколько операторов if / else с использованием операторов instanceof.

Ответы [ 4 ]

7 голосов
/ 18 июля 2011

Вы можете использовать двойная отправка . Имейте MyInterface.build, который затем перегружается в ваших классах реализации для вызова соответствующего метода. e.g.:

interface MyInterface {
    void build(Thingy t);
}

class MyImplOneOfAnInterface implements MyInterface {
    void build(Thingy t) { t.build(this); }
}

...

void buildIt(MyInterface item) {
    item.build(this);
}
3 голосов
/ 18 июля 2011

Поместите логику build() в реализацию. , Поэтому вместо build(item) звоните item.build().

Или взгляните на шаблон посетителей , где вы можете сделать item.build(builder) вместо builder.build(item)

1 голос
/ 18 июля 2011

Вы смотрите наследство не с той стороны.

MyImplOne ... и MyImplTwo - обе реализации вашего интерфейса. Но если вы назовете build (item), он найдет

public void build(MyInterface item):

в противном случае может оказаться, что вы передаете объект, реализующий ваш интерфейс, но не принадлежащий ни к классу MyImplOne, ни к MyImplTwo.

Как определение метода

public void print(Vector vector);

и надеемся, что компилятор сможет разрешить

print(new Object());
0 голосов
/ 18 июля 2011

Он передается в void buildIt(MyInterface item) как тип MyInterface.Когда вы пытаетесь вызвать build(item), он ищет метод с подписью void build(MyInterface item).Как видите, этот метод не существует - вот почему вы получаете символ не найден.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...