gpt4 book ai didi

java - Java中的反射和继承

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:30:12 24 4
gpt4 key购买 nike

我有以下代码片段:

class BaseClass {
public Integer getX() {
return 5;
}
}

class InheritedClass extends BaseClass implements Interface {
}

interface Interface {
public Number getX();
}

public class Test5 {
public static void main(String[] args) throws Exception {
System.out.println(InheritedClass.class.getMethod("getX").getReturnType());
}
}

这段代码返回的是java.lang.Number,这让我很奇怪,因为BaseClass的getX方法返回的是java.lang.Integer .最有趣的是,如果 BaseClass 实现了 Interface,返回的类型是 java.lang.Integer...这是正常行为吗?

最佳答案

这是我认为会发生的情况。

通过同时扩展 BaseClass 和实现 Interface,子类 promise 提供两个 getX() 方法:

public Integer getX();
public Number getX();

由于不能重载返回类型,因此只能有一种方法。此外,它的返回类型必须是 Number 而不是 Integer(因为您可以将后者转换为前者,但反之则不行)。

为了协调以上所有内容,编译器会自动在 InheritedClass 中生成以下方法:

  public java.lang.Number getX();
Code:
0: aload_0
1: invokevirtual #22 // Method getX:()Ljava/lang/Integer;
4: areturn

如您所见,它具有 Interface 中方法的签名,但自动委托(delegate)给 BaseClass 中的方法(使用隐式向上转换)。

这个自动生成的方法是您的反射代码正在获取的。

关于java - Java中的反射和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15274676/

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