Выбор метода во время компиляции.Что если параметр может иметь несколько типов? - PullRequest
3 голосов
/ 02 декабря 2011

Меня убеждают, что компилятор java выполняет всю работу по выбору методов во время компиляции (или я не прав?).То есть он будет точно определять, какой метод использовать в каком классе во время компиляции, изучая иерархию классов и сигнатуры методов.Все, что затем требуется во время выполнения, - это выбрать объект, метод которого должен быть вызван, и это может работать только up в цепочке наследования.

Если это так, как это сделать?работа?

int action = getAction ();
StringBuilder s = new StringBuilder()
    .append("Hello ") // Fine
    .append(10) // Fine too
    .append(action == 0 ? "" : action); // How does it do this?

Здесь тип параметра может быть либо String, либо int.Как он может решить во время компиляции, какой метод StringBuilder должен быть вызван?

Ответы [ 2 ]

4 голосов
/ 02 декабря 2011

Выражение типа

action == 0 ? "" : action

может иметь один тип возвращаемого значения.Компилятор понимает это как выражение, возвращающее экземпляр Object.Во время выполнения это может быть либо String, либо Integer.

. В вашем случае будет вызываться append(Object).Затем реализация StringBuilder вызовет toString() для параметра, который даст ожидаемый результат (либо "", либо целочисленное значение, преобразованное в String).

0 голосов
/ 02 декабря 2011

StringBuilder имеет много перегруженных методов, называемых append. Таким образом, есть другое приложение для большинства типов. Любой другой тип является объектом.

StringBuilder   append(boolean b)
Appends the string representation of the boolean argument to the sequence.
StringBuilder   append(char c)
Appends the string representation of the char argument to this sequence.
StringBuilder   append(char[] str)
Appends the string representation of the char array argument to this sequence.
StringBuilder   append(char[] str, int offset, int len)
Appends the string representation of a subarray of the char array argument to this sequence.
StringBuilder   append(CharSequence s)
Appends the specified character sequence to this Appendable.
StringBuilder   append(CharSequence s, int start, int end)
Appends a subsequence of the specified CharSequence to this sequence.
StringBuilder   append(double d)
Appends the string representation of the double argument to this sequence.
StringBuilder   append(float f)
Appends the string representation of the float argument to this sequence.
StringBuilder   append(int i)
Appends the string representation of the int argument to this sequence.
StringBuilder   append(long lng)
Appends the string representation of the long argument to this sequence.
StringBuilder   append(Object obj)
Appends the string representation of the Object argument.
StringBuilder   append(String str)
Appends the specified string to this character sequence.
StringBuilder   append(StringBuffer sb)
...