Java:自动投射如何工作?

Mar*_*fer 1 oop inheritance

从一本书:

如果要调用由超类变量引用的对象的子类定义的方法,该怎么办?假设SoftBall类有一个名为riseBall的方法,它不是由Ball类定义的.你如何从Ball变量中调用它?一种方法是创建子类的变量,然后使用赋值语句来转换对象:

Ball b = new SoftBall();
SoftBall s = (SoftBall)b;
// cast the Ball to a SoftBall
s.riseBall();
Run Code Online (Sandbox Code Playgroud)

我不明白这一点.为什么我不能直接从变量b调用方法?(在这种情况下,变量b包含一个垒球对象).为什么铸造?

And*_*ner 5

你如何从Ball变量中调用它?

你不能.编译器不知道这Ball是一个SoftBall而不是一个BaseBall.

你必须明确地施放.这只是向编译器说的一种方式:"我比你更了解这个实例的类型".编译器信任你(主要是:它不会让你把它投射到,比方说,a String),并让你处理后果(例如潜在的ClassCastException)