抱歉,这是我的情况; 我正在学习这本书,名为“彻底攻略Java SE 11 Silver问题集”,这是日本初学者Java工程师想要参加Oracle Java Silver测试的一本流行教科书。
第二章中的问题 8 基本上询问以下内容是否可以编译,因为每个内容都在单独的文件中定义。
答案是不会,因为
a = new C();
正在尝试从 B 转换为 C,这是不兼容的。 B 和 C 扩展了 A,但这并不意味着它们彼此兼容。
我明白了,事实上这在我测试过的大多数环境中都不起作用。
但是,我已经在自己的文件中定义了每个文件并在 java 21.0.2 中运行它并打印“C”。
怎么会这样?
如果答案是“因为多态性”,那么有人可以详细说明吗...
ChatGPT 和 Copilot 都说它应该可以正常工作,尽管我的教科书说它不应该。
class Main {
public static void main(String[] args) {
var a = new B();
a = new C();
System.out.println(a);
}
}
class A {
public void test(){
System.out.println("A");
}
}
class B extends A{
@Override
public void test(){
System.out.println("B");
}
}
class C extends A{
@Override
public void test(){
System.out.println("C");
}
}
我尝试了java 5、8、15和21中的代码。 在java 5,8,15中,我只用一个文件尝试过。这是因为我在 Hackerrank 测验中使用了网络编译器。 21 我两种都试过了。
var
是Java≥10的一个特性,它是一个类型推断构造。该代码在 5 或 8 中无法编译。
当我们使用var
声明变量时,编译器通过确定初始化表达式的类型来推断变量的类型。
因此:
var a = new B(); // initialisation expression has type B
所以它与(但由编译器推断)完全相同:
B a = new B();
当你写下:
a = new C();
编译器认为这是一个错误,因为
C
不是 B
。
使这两行正确的唯一方法是输入
a
以及 B
和 C
的常见超类型:
A a = new B();
a = new C();
注意:不要依赖 ChatGPT。