gpt4 book ai didi

java - 在克隆中使用协变返回类型真的会破坏兼容性吗?

转载 作者:行者123 更新时间:2023-11-30 04:33:33 24 4
gpt4 key购买 nike

我最近遇到过Why doesn't Java 5+ API take advantage of covariant return types?

我同意这个问题,在 Java 5 JDK 中,开发人员可以使用协变返回类型进行克隆并更改现有类,以便我们可以编写

ArrayList<String> list = new ArrayList<String>();
ArrayList<String> clone = list.clone();

而不是

ArrayList<String> clone = (ArrayList<String>)list.clone();

但由于某些原因,他们没有这样做。

我做了一些实验,将我的 test.ArrayList.clone 返回类型从 Object 更改为 ArrayList,以查看是否“以前编译的类无法找到具有新返回类型的方法”但无法重现问题。在字节码中,对旧的 test.ArrayList.clone 的调用看起来像

 INVOKEVIRTUAL test.ArrayList.clone()Ljava/lang/Object;

也就是说,方法签名包含返回类型,因此在我更改后,其签名更改为 test.ArrayList.clone()Ltest.ArrayList。所以看起来旧的类会崩溃,但实际上不会,因为 test.ArrayList.class 中有 2 个克隆方法

  public clone()Ltest.ArrayList;
public bridge clone()Ljava/lang/Object;

第二个是一个桥,它所做的只是调用协变版本

 ...
INVOKEVIRTUAL ArrayList.clone()Ltest.ArrayList;
...

所以旧的类可以毫无问题地继续工作。

谁能解释一下改变克隆的返回类型如何破坏字节码?

最佳答案

This answer链接的问题确实包含原因:它会破坏覆盖 clone 方法并指定 Object 作为返回类型的 ArrayList 的所有子类。

关于java - 在克隆中使用协变返回类型真的会破坏兼容性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14021601/

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