Возможно ли динамическое разрешение перегрузки в Java? - PullRequest
8 голосов
/ 24 декабря 2010

Итак, у меня есть класс перегруженных методов, таких как:

class Foo {
    public void test(Object value) {
        ...
    }

    public void test(String value) {
        ...
    }
}

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

public void run(Object bean, String propertyName) {
    Foo foo = new Foo();
    foo.test(PropertyUtils.getProperty(bean, propertyName));
}

Кстати, PropertyUtils.getProperty() - это вспомогательный метод, который возвращает значение указанного свойства в компоненте.PropertyUtils.getProperty() возвращает объект, так что test(Object value) будет вызываться всегда, а фактический тип свойства будет игнорироваться.

Я могу выяснить тип свойства во время выполнения, даже если его значение равно нулю.Есть ли такая вещь, как динамическое приведение в Java?Если нет, есть ли способ получить перегруженный метод с правильным типом параметра с именем?

Ответы [ 4 ]

5 голосов
/ 24 декабря 2010

Переопределение - это то, что имеет динамическое связывание в Java.Перегрузка имеет статическую привязку, и какая функция вызывается, определяется во время компиляции, а не во время выполнения. См. Этот вопрос SO.

Поэтому вы не можете использовать перегрузку для выбора методов во время выполнения.Предложите использовать один из других шаблонов проектирования ООП в Java или, по крайней мере, instanceof:

public void dispatch(Object o)
{
   if (o instanceof String)
       handleString((String)o);
   else if (o instanceof File)
       handleFile((File)o);
   else
       handleObject(o);
}
3 голосов
/ 24 декабря 2010

Это работа для шаблона посетителя.

1 голос
/ 24 декабря 2010

Я не уверен, что вы хотите получить ответ на этот вопрос.Вы заинтересованы в настройке ситуации, когда

test((String)x)

не делает то же самое, что

test((Object)x)

Для x, которые String с.Это плохая идея ™, и она может привести к путанице.Используйте другое имя метода, если вам действительно нужно другое поведение.

Просто сделайте test(Object x) отправку test(String x), если x - String, тогда вам не нужно беспокоиться о том, какой test метод вызывается.

1 голос
/ 24 декабря 2010

Разрешение перегруженного метода происходит во время компиляции в Java.Вам придется выполнить разрешение самостоятельно (переключатель, лестница if-then-else или просмотр таблицы) или найти другой шаблон, который может быть реализован в Java.

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