Eclipse 报告数组 clone() 方法来自其对应的类型(包括原语)?

Posted

技术标签:

【中文标题】Eclipse 报告数组 clone() 方法来自其对应的类型(包括原语)?【英文标题】:Eclipse reporting an array's clone() method is from it's corresponding type (including primitives)? 【发布时间】:2015-10-06 19:10:39 【问题描述】:

我假设当 eclipse 建议方法时,它的形式是

 <methodName>(<any parameters>) : <retunType> - <actual class the method will be invoked from>

而且发布的图片中的所有方法(但 clone())似乎也是如此。

但是对于clone(),eclipse 表示方法来自数组的类型(本例中为byte)。

所有原始类型数组引用类型数组都是一样的。

例如:对于String[],它给出clone() : String[] - String

这是什么意思?我的理解错了吗?还是clone() 方法中还有别的东西?

为了清楚起见,我的问题是 为什么 eclipse 说“clone()”来自 byte 而它应该来自 byte[] 就像“length”一样

【问题讨论】:

【参考方案1】:

这个只能通过查看eclipse源码来回答。

您的问题的答案很简单且令人失望:生成完整提案的 Eclipse UI 代码构建了一个错误的显示。请注意,数组长度属性的完整提案显示了正确的类型(在您的示例中为 byte[])。

详情:

当您触发完成助手时,可能的完成计算为CompletionProposals。

CompletionProposals 的属性用于显示提议的方法或字段完成的类型是 declaringTypeSignature(见下文)。

CompletionTests 表明克隆方法的提案对象和字节数组的长度字段将具有声明类型签名“[B”。

现在CompletionProposalLabelProvider 采用这些提案对象并以StyledString 的形式构建视图。方法#createLabelWithTypeAndDeclaration 用于字段建议,方法#createMethodProposalLabel 用于方法建议。它们对声明类型的显示有不同的实现。

方法显示调用SignatureUtil.stripSignatureToFQN,传递“[B”作为签名。返回的结果去掉了所有的数组信息,只是简单的“字节”。

字段显示调用Signature.getSignatureSimpleName 传递“[B”。该方法不忽略数组信息,返回“byte[]”。

【讨论】:

基于以上分析(非常感谢!)这个bug已经修复,见bugs.eclipse.org/473101【参考方案2】:

这是因为克隆取决于对象的类型。这取决于对象或原始数据类型的内存大小。

clone() 方法实际上是 'Object' 超类的方法。其他类应该覆盖它并实现自己的实现以进行安全克隆。如果什么都不提供,则调用并执行Object类的正常克隆。

这就是为什么,克隆一个数组取决于数组保存的数据类型,并且会调用该数据类型的克隆方法。如果您有一个 int[],则将调用 clone for int。如果你有 A 类,并且 'a' 是 A 类的对象,并且你有 'a' 对象数组 (a[]),则将调用来自 A 类的克隆。

希望能回答你的问题。

【讨论】:

因为,数组可以看作是任何一种对象/数据类型的集合。如果您选择 int 数组,则数组类无法知道 int 占用多少空间。如果选择对象数组,数组类无法知道一个对象占用了多少空间。因此,它将责任交给数组所属的类。这就是为什么 clone() 来自数据类型而不是来自数组类的原因。希望这会有所帮助。 克隆数组不会克隆其包含的元素,A[] 不会调用 A 类的克隆。

以上是关于Eclipse 报告数组 clone() 方法来自其对应的类型(包括原语)?的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何按值传递数组? Clone() 不气馁吗?

clone()方法

Java数组调用clone()方法,返回的对象是深拷贝还是浅拷贝?

Java 数组复制之clone方法

Java 数组的克隆方法

Eclipse中使用Git之一把远程仓库的项目,clone到eclipse里面