如果类在单独的文件中定义,java多重继承(有点)可以工作吗?

问题描述 投票:0回答:1

抱歉,这是我的情况; 我正在学习这本书,名为“彻底攻略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 我两种都试过了。

java inheritance polymorphism
1个回答
0
投票

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。

© www.soinside.com 2019 - 2024. All rights reserved.