转换是否会在运行时更改声明/引用类型?

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)

我知道这可能看起来微不足道,但我将在下个季度进行辅导,我不想教学生错误的东西。本季度我的教授和她的助手在这个问题上意见不一致。我的教授认为,强制转换确实完全改变了单个语句在运行时声明的类型。助教坚信,在运行时,仅检查强制转换,但实际上并没有更改声明的类型。

Ste*_*n C 3

我的教授认为,强制转换确实完全改变了单个语句在运行时声明的类型。助教坚信,在运行时,仅检查强制转换,但实际上并没有更改声明的类型。

事实上,我认为他们在某种意义上都是对的。他们所说的并不矛盾……如果你能弄清楚他们实际上在说什么。

声明的类型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) tObject...不是Test声明的类型(而不是运行时类型)决定了method特定调用使用两个重载中的哪一个。

看?

这完全取决于你在说什么变量的声明类型,或表达式的声明类型。