Как Java выбирает который перегруженная функция звонить?

Примерно так (?):

def sliding_count(a, nx0, nx1, window):
    bin0 = np.arange(nx0,nx1,1)
    bin1 = bin0 + window 
    count = np.zeros((nx1-nx0), dtype=int)

    for j in range(nx1-nx0):
        count[j] = np.sum(a<=bin1[j]) - np.sum(a<bin0[j])
    return count

#---- main ---------------  
nx0, nx1, window = 0, 11, 10
a = np.array([1, 5, 8, 11, 14, 19])
sliding_count(a, nx0, nx1, window)

array([3, 4, 3, 3, 4, 4, 3, 3, 3, 3, 3])

Я не проверял код для nx0> 0 и step> 1 в bin0 = np.arange (nx0, nx1,1) . Таким образом, длина цикла for должна быть изменена для таких случаев.

9
задан Claudiu 22 December 2008 в 04:20
поделиться

3 ответа

Формальная спецификация может быть найдена в части 15.12.2.5 Спецификации языка Java (JLS). Благодаря дженерикам это довольно сложно, таким образом, Вы могли бы хотеть посмотреть на тот же раздел первого выпуска JLS.

Это в основном говорит, что компилятор пытается найти версию метода, где все параметры включая объект, метод призван, являются самыми конкретными. Если никакой такой метод не существует (например, так как Вы имеете method(Base, Sub) и method(Sub, Base) но нет method(Sub, Sub)), затем сбои компиляции.

Обратите внимание, что фактический выбор метода зависит от динамического типа целевого объекта, например, методы, но не для параметров. Ваш пример все еще работал бы то же на уровне экземпляра.

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

8
ответ дан 4 December 2019 в 21:13
поделиться

Насколько я знаю, Java и C++ принимают это решение во время компиляции (так как это статические функции, которые не динамично dispatchable) на основе самого определенного соответствия, которое они могут сделать. Если Вашим статическим типом является SubSub, и у Вас есть перегрузка, которая берет SubSub, это - то, которое будет вызвано. Я абсолютно уверен, что это находится в обоих стандартах.

Если у Вас будут ссылка или указатель на Основу, даже если это будет содержать Sub или SubSub, то Вы будете соответствовать версии, которая берет Основу, потому что во время компиляции, который является единственным обеспечением, что компилятор имеет.

2
ответ дан 4 December 2019 в 21:13
поделиться

При перегрузке статических методов затем, это называет тот метод, который сразу определяется в классе, который вызывает метод. Если однако, никакой метод не будет определен в классе вызова затем, то он вызовет метод, наследованный от его класса непосредственного родителя.

В Вашем случае существует два перегруженных метода, оба из которых могут принять SubSub как параметр. компилятор проверяет на самое определенное соответствие и идет для него. Но самое определенное соответствие является обычно самым низким в иерархии типа.

ОТРЕДАКТИРОВАННЫЙ

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

0
ответ дан 4 December 2019 в 21:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: