Kac*_*aye 5 java casting runtime
首先,让我明确一下声明类型的含义。假设 SuperBoss 是 Boss 类的超类。
SuperBoss mrBond = new Boss();
Run Code Online (Sandbox Code Playgroud)
SuperBoss 是声明的类型,Boss 是实际的类型。
就我个人而言,我认为由于以下运行时异常,声明的类型在运行时发生了更改:
SuperBoss mrWayne = new SuperBoss();
((Boss)mrWayne).randomMethod();
//Exception: java.lang.ClassCastException: SuperBoss cannot be cast to Boss
Run Code Online (Sandbox Code Playgroud)
我知道这可能看起来微不足道,但我将在下个季度进行辅导,我不想教学生错误的东西。本季度我的教授和她的助手在这个问题上意见不一致。我的教授认为,强制转换确实完全改变了单个语句在运行时声明的类型。助教坚信,在运行时,仅检查强制转换,但实际上并没有更改声明的类型。
我的教授认为,强制转换确实完全改变了单个语句在运行时声明的类型。助教坚信,在运行时,仅检查强制转换,但实际上并没有更改声明的类型。
事实上,我认为他们在某种意义上都是对的。他们所说的并不矛盾……如果你能弄清楚他们实际上在说什么。
声明的类型mrWayne不会改变。声明的类型((Boss) mrWayne)确实“改变”。或者至少,它与 的声明类型不同mrWayne。
这里真正的问题是有人使用了草率的术语……而且人们在互相谈论。
好的,考虑这个例子:
public class Test {
public static void method(Object t) {
system.out.println("Its an object");
}
public static void method(Test t) {
system.out.println("Its a test");
}
public static void main(String[] args) {
Test t = new Test();
method(t);
method((Object) t);
}
}
Run Code Online (Sandbox Code Playgroud)
这应该输出:
Its a test
Its an object
Run Code Online (Sandbox Code Playgroud)
为什么?因为的声明类型(Object) t是Object...不是Test。声明的类型(而不是运行时类型)决定了method特定调用使用两个重载中的哪一个。
看?
这完全取决于你在说什么。变量的声明类型,或表达式的声明类型。
| 归档时间: |
|
| 查看次数: |
6422 次 |
| 最近记录: |