Перегрузка метода Java + двойная отправка

Краткое решение для Javascript:

Array.prototype.combine=function combine(k){    
    var toCombine=this;
    var last;
    function combi(n,comb){             
        var combs=[];
        for ( var x=0,y=comb.length;x<y;x++){
            for ( var l=0,m=toCombine.length;l<m;l++){      
                combs.push(comb[x]+toCombine[l]);           
            }
        }
        if (n<k-1){
            n++;
            combi(n,combs);
        } else{last=combs;}
    }
    combi(1,toCombine);
    return last;
}
// Example:
// var toCombine=['a','b','c'];
// var results=toCombine.combine(4);
16
задан durron597 21 April 2015 в 17:58
поделиться

2 ответа

Состояния JLS в §8.4.9 Перегрузка :

  1. Когда вызывается метод (§15.12), количество фактических аргументов (и любые аргументы явного типа) и компиляция -временные типы аргументов используются во время компиляции для определения сигнатуры вызываемого метода (§15.12.2).
  2. Если вызываемый метод является методом экземпляра, фактический вызываемый метод будет определен во время выполнения с использованием динамического поиска метода (§15.12.4).

Итак, в вашем случае:

  1. Аргумент метода ( this ) имеет тип времени компиляции Parent , поэтому метод print (Parent) вызывается.
  2. Если класс Worker был подклассом и подкласс переопределил бы этот метод, а экземпляр worker был из этого подкласса, то был бы вызван переопределенный метод.

Двойная отправка не существует в Java. Вы должны смоделировать это, например с помощью шаблона посетителей . В этом шаблоне, в основном, каждый подкласс реализует метод accept и вызывает посетителя с this в качестве аргумента, а this имеет в качестве типа времени компиляции этот подкласс, поэтому используется желаемая перегрузка метода.

23
ответ дан 30 November 2019 в 21:10
поделиться

Причина в том, что doJob реализован в Parent и не перегружен в Child. Он передает this методу print рабочего, поскольку this имеет тип Parent, будет вызван метод Worker::print(Parent).

Чтобы вызвать Worker::print(Parent), необходимо перегрузить doJob в Child:

public static class Child extends Parent {
    public void doJob(Worker worker) {
        System.out.println("from Child: this is " + this.getClass().getName());

        worker.print(this);
    }
}

В приведенном выше коде this.getClass() в Child эквивалентен Child.class.

5
ответ дан 30 November 2019 в 21:10
поделиться
Другие вопросы по тегам:

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