gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:53:09 27 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

我知道这可能看起来微不足道,但下个季度我要补习,我不想教给学生错误的东西。本季度我的教授和她的助手在这个问题上彼此意见不一。我的教授认为强制转换确实会在运行时完全改变单个语句的声明类型。 T.A.坚信在运行时,转换只是被检查,但实际上并没有改变声明的类型。

最佳答案

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 的声明类型。

这里真正的问题是有人在使用草率的术语……而且人们正在互相交谈。


OK 考虑这个例子:

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/17120698/

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