class Rectangle {}
class ColoredRectangle extends Rectangle {}
class Base {
void foo(Rectangle x) {
System.out.println("Base: foo(Rectangle)");
}
}
class Sub extends Base {
@Override
void foo(Rectangle x) {
System.out.println("Sub: foo(ColoredRectangle)");
}
}
public class WhatHappensHere {
public static void main(String[] args) {
Sub o = new Sub();
Rectangle rc = new ColoredRectangle();
((Base) o).foo(rc);
}
}
我很难意识到这个(Base) o
是否会更改o
的静态类型。我记得我在这里被告知它不会改变它,那它是做什么的?为什么我需要这样做?在什么条件和目的?
由于
答案 0 :(得分:3)
它不会更改o
的静态类型,因为表达式o
仍然是Sub
类型 - 但表达式(Base) o
的类型为Base
}。我认为你的意思是它不会改变o
引用的对象的类型。在这种情况下,没有任何目的可以转换为Base
。它不会更改foo()
调用的执行。然而,有各种不同的情况, 。
答案 1 :(得分:1)
它什么都不做。在其他一些语言中,这可能会调用foo
中定义的Base
,但在这种情况下,它仍会调用Sub.foo