![](/img/trans.png)
[英]Why doesn't polymorphism work in a generics method when using an interface?
[英]why polymorphism doesn't matters when a method is overloaded?
我知道重载方法是在编译时根据引用该方法的引用类型确定的,而重载方法是由引用该方法的引用的实际对象类型确定的,问题是为什么多态性只与重载有关,而不与重载有关?
使Java中的多态性成为可能的实现机制是基于方法的第一个参数的运行时类型动态分配方法(在调用a.method(b, c)
, a
可被视为方法的第一个参数)。 因此,Java是一种单独的调度 OOP语言。 结果是所有其他参数都不参与此机制,并且它们的类型在编译时静态确定。 例如,如果您有
class MyObject {
public boolean equals(MyObject o) { ... }
}
接着
MyObject m1 = new MyObject();
Object o = new MyObject();
System.out.println(m1.equals(o));
永远不会输出true
因为没有调用您的方法。 编译器看到调用MyObject.equals(Object)
并将其编译为对继承方法Object.equals(Object)
的调用。 运行时方法分派机制将仅决定要调用哪个重写方法equals(Object)
。
顾名思义,多态是指“相同形式”的方法在不同上下文中表现出不同的行为。 术语“相同形式”是指“相同签名”。 这意味着您不能将多态与重载方法相关联,因为它们以“不同形式”开头。 考虑它的另一种方法是-您需要一个类型和一个子类型以查看实际中的多态性-重载的方法再次在单个类的上下文中定义。
这是出于技术原因。 通常,在运行时仅分析this
指针作为方法的隐藏的第一个参数,以确定要调用的方法。
当分析其他参数时,也称为多重调度 。 有几种语言本机支持多种调度。
您对此感到困惑。
Overloading
是指在同一类(不是层次结构)中选择名称相同但签名不同的方法之一。
在相同名称的方法中选择Overriding
,这取决于父类继承的方法中的运行时类型。
如果您有一个具有相同名称和签名的方法的基类和派生类,则此方法将被overriding
并在运行时确定正确的方法。
为了overloading
,编译器从同一类可用的方法中选择正确的方法版本。
无需查找运行时类型。 编译器可以在编译时解决这个问题
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.