Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何推断超类型中的子类型_Java - Fatal编程技术网

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.