假设你有一个超级班。在该超类中,您希望将自身的运行时对象(this
)作为参数传递给重载方法。特技是,这个重载方法被子类类型重载。当你尝试这样做时,你会得到一个
方法......不适用(实际参数 ...无法通过方法调用转换为... 转化率)
相反,您需要在每个子类型中单独实现该方法(只是为了获得正确的运行时类),当方法的内容相同时,这是很多重复工作。
e.g:
public class InferTypeTest {
public static void main(String[] args) {
SubClass1 s1 = new SubClass1();
s1.sayHi();
}
public static void sayHi(SubClass1 clz) {
System.out.println("clz 1");
}
private abstract static class SuperClass{
public void sayHi() {
InferTypeTest.sayHi(this);
}
}
private static class SubClass1 extends SuperClass{
}
}
答案 0 :(得分:2)
是的,这是双重调度的工作原理,您必须覆盖每个子类中的accept方法,如下所示:
private static abstract class NodeWithChildren implements DomNode {
/* snip */
public void accept(DomNodeVisitor visitor) {
for (DomNode child : children) {
child.accept(visitor);
}
}
}
private static class BodyNode extends NodeWithChildren {
public void accept(DomNodeVisitor visitor) {
visitor.visit(this);
super.accept(visitor);
visitor.visited(this);
}
}
private static class DivNode extends NodeWithChildren {
public void accept(DomNodeVisitor visitor) {
visitor.visit(this);
super.accept(visitor);
visitor.visited(this);
}
}
}
答案 1 :(得分:0)
BodyNode是一个NodeWithChildren DivNode是NodeWithChidren NodeWithChildren是一个DomNode DomPrinterVisitor是一个DomNodeVisitor DomNodeVisitor的访问者可以访问“BodyNode”或“DivNode,但您正在通过”NodeWithChildren“访问。 这里BodyNode是NodeWithChildren,但NodeWithChildren不是BodyNode /
Theary is if B extends A, you can say B is a A/ not A is a B.