这是一个例子。
Class A {
Method A();
Method B();
Method C();
}
// A and B are not interfaces
Class B extends A {
Method C(int);
}
Class Harness {
A ob = new B ();
ob.C(3);
}
IDE抱怨ob.C(3)
无法对C
中的A
方法进行C
,因为C
不需要参数。但据我所知,我在B
中调用方法['enablePushState'=>flase, 'enableReplaceState=>true]
。
据我所知,变量类型确定要使用其分配引用的对象调用的方法集,但实际对象确定将被调用的确切方法。那么为什么它不起作用?
答案 0 :(得分:3)
您已将B
类型的对象分配给A
类型的变量。类A
上没有方法C
,编译器抱怨,因为它必须链接到基于变量的声明的类型的方法 - 即A
。除非类型A
具有方法C
的某种声明,否则编译器无法知道在对{{{{}的引用上调用该方法是安全的。 1}}类型。
答案 1 :(得分:2)
正如您在问题本身中提到的那样,变量的类型决定了可以使用它调用的所有方法。在您的示例中,class A
没有带签名C(int)
的方法。它只有一个签名为C()
的方法。因此,B中的方法C(int)
甚至不是一个被重写的方法。这是一种重载方法。
运行时多态性仅适用于重写方法。
您必须让class A
拥有C(int)
方法才能成功编译此代码。
答案 2 :(得分:0)
您已将<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<div class="container"></div>
声明为new B
的实例,并且没有方法A
以使其工作,您必须再次至少投射C
它B.假设这是一个伪代码,这可行:
ob