如何推断超类型中的子类型

时间:2012-06-02 19:40:28

标签: java

假设你有一个超级班。在该超类中,您希望将自身的运行时对象(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{

    }

}

2 个答案:

答案 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.