Краткое решение для 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);
Состояния JLS в §8.4.9 Перегрузка :
Итак, в вашем случае:
this
) имеет тип времени компиляции Parent
, поэтому метод print (Parent)
вызывается. Worker
был подклассом и подкласс переопределил бы этот метод, а экземпляр worker
был из этого подкласса, то был бы вызван переопределенный метод. Двойная отправка не существует в Java. Вы должны смоделировать это, например с помощью шаблона посетителей . В этом шаблоне, в основном, каждый подкласс реализует метод accept
и вызывает посетителя с this
в качестве аргумента, а this
имеет в качестве типа времени компиляции этот подкласс, поэтому используется желаемая перегрузка метода.
Причина в том, что 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
.