2013-03-15 6 views
0

У меня есть, не универсальный метод для перегружен для конкретных объектов EX:Вызов необщего метод из общего метода

protected boolean internalAdd(IP4BlockObject block) {...} 
protected boolean internalAdd(IP4NetworkObject network) {...} 

Я хочу написать один метод, как

protected <T extends AbstractEntityObject>boolean internalAdd(T t) {} 

и от этого метод может я назвать не общий метод (без использования оператора instanceof;))

+2

Что вы пытаетесь сделать? вопрос не совсем ясен. – benzonico

+0

Итак, вы хотите использовать общий метод, который волшебным образом понимает, какой конкретный метод вызывать? –

+0

Я думаю, если я правильно понимаю довольно расплывчатый вопрос, ответ отрицательный. Если вы собираетесь обрабатывать все различные объекты, которые могут быть переданы, ваш метод все равно должен знать, какой тип он получил, если только один обработчик будет для всех типов. – Sticks

ответ

1

Нет, что будет ошибка времени компиляции.

Метод internalAdd (IP4BlockObject) в типе не применяется для аргументов (Т)

Потому что ваши методы типа:

protected boolean internalAdd(IP4BlockObject block) {...} 
protected boolean internalAdd(IP4NetworkObject network) {...} 

И protected <T extends AbstractEntityObject>boolean internalAdd(T t) {} вы получите t как тип T. Так что, если вы звоните:

internalAdd(t); 

это даст компиляции ошибки времени, потому что internalAdd() ожидать только IP4BlockObject или IP4NetworkObject.

Примечание: Если все это метод на том же классе, то internalAdd(t); будет вызывать ваш общий метод снова, так что вы будете в конечном итоге с бесконечной петли.

0

Я полагаю, IP4BlockObject и IP4NetworkObject extends AbstractEntityObject и вы хотите отправить между перегруженными методами, используя абстрактную ссылку? Я так, я действительно не понимаю цели использования общего метода для этого. Почему бы вам не объявить этот метод таким образом:

boolean internalAdd(AbstractEntityObject object) {} 

Затем вам нужно выбрать желаемый метод для данного объекта. Не существует прямого способа сделать это без использования оператора instance of или какого-либо полиморфного метода, дающего тип производного класса, например. как enum.

Если вы хотите убежать от этого, вы можете переписать код и позволить производным классам самостоятельно выбирать желаемый метод, вызывая их полиморфный метод с некоторым интерфейсом. Но действительно ли это стоит?