gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 21:44:14 25 4
gpt4 key购买 nike

首先,让我明确一下声明类型的含义。假设 SuperBoss 是 Boss 类的父类(super class)。

SuperBoss mrBond = new Boss();

SuperBoss 是声明的类型,Boss 是实际的类型。

就我个人而言,我认为由于以下运行时异常,声明的类型在运行时发生了更改:

SuperBoss mrWayne = new SuperBoss();
((Boss)mrWayne).randomMethod();

//Exception: java.lang.ClassCastException: SuperBoss cannot be cast to Boss

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

最佳答案

My professor believes that casting does indeed completely change the declared type at run-time for a single statement. The T.A. strongly believed that at run-time, the cast is merely checked, but doesn't actually change the declared type.

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

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);
}
}

这应该输出:

Its a test
Its an object
为什么?因为 (Object) t声明类型是 Object ...而不是 Test声明的类型(而不是运行时类型)决定了 方法的两个重载中的哪一个用于特定调用。

看到了吗?

这完全取决于您所谈论的内容。变量的声明类型,或表达式的声明类型。

关于java - 转换是否会在运行时更改声明/引用类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58782800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com