Java 如何推断超类型中的子类型
假设你有一个超级班。在该超类中,您希望将自身的运行时对象(Java 如何推断超类型中的子类型,java,Java,假设你有一个超级班。在该超类中,您希望将自身的运行时对象(this)作为参数传递给重载方法。诀窍是,这个重载方法由子类类型重载。当你试着去做的时候,你会得到一个 方法。。。不适用(实际参数 无法通过方法调用将…转换为 转换) 相反,您需要在每个子类型中分别实现该方法(只是为了获得正确的运行时类),当该方法的内容相同时,这将是大量重复的工作 e、 g: 是的,这就是双重分派的工作方式,您必须在每个子类中重写accept方法,如下所示: private static abstract cla
this
)作为参数传递给重载方法。诀窍是,这个重载方法由子类类型重载。当你试着去做的时候,你会得到一个
方法。。。不适用(实际参数
无法通过方法调用将…转换为
转换)
相反,您需要在每个子类型中分别实现该方法(只是为了获得正确的运行时类),当该方法的内容相同时,这将是大量重复的工作
e、 g:
是的,这就是双重分派的工作方式,您必须在每个子类中重写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);
}
}
}
BodyNode是一个包含子节点的节点 DivNode是一个包含子节点的节点 NodeWithChildren是一个DomNode DomPrinterVisitor是一个DomNodeVisitor DomNodeVisitor的访问者可以访问“BodyNode”或“DivNode”,但您要访问的是“NodeWithChildren”。 这里BodyNode是一个带有子节点的节点,但NodeWithChildren不是BodyNode/
Theary is if B extends A, you can say B is a A/ not A is a B.
我想说的是,必须有更好的方法来设计整个结构,但根据您提供的代码,很难找出问题的核心。您能简化示例吗?嗯,这是一个相当简单的访问者模式…(当然是人为的).好的,我确实明白你的意思。好的,简化了示例代码。你能回去修改一下吗?我一眼就看不清楚。所以,简而言之,在Java中,你不能引用对象的运行时类型?这不是关于Java的支持/它纯粹是关于面向对象的。代码试图违反面向对象原则好的。在这个例子中(更新的)超类是抽象的-在运行时你不能有超类的实例。对对象的实际运行时类型有某种支持难道没有意义吗?我理解你的观点(A!=B),但这是编译时。
Theary is if B extends A, you can say B is a A/ not A is a B.