上周在我们的java课程中,我们介绍了Object类及其一些方法 其中一种方法是克隆(),当我们的老师向我们解释这种方法时,我们被告知 我们克隆一个对象时,我们必须通过clone()向下转换返回的对象 因为clone()返回Object类型的对象。
因此,我无法找到一个理由为什么这个方法更喜欢返回一个通用的Object,因为它可以使用getClass()之类的另一个方法轻松获取克隆对象的类型 并自动处理下行。
哦,顺便说一下,这不是作业,只是我个人的好奇心让我问这个问题(我的老师可以给我一个确切的答案,所以我决定让他现在去做:D)答案 0 :(得分:4)
这是因为clone()的java.lang.Object基类签名返回Object。您可以在子类方法上覆盖返回的类型,但无论如何它都不是必需的。既然你已经知道你正在克隆的类,你可以简单地将它转换为你正在克隆的类,一切都会好的。
重读你的问题,我注意到你问为什么它不只是获取克隆对象的类型并自动处理向下转换。在内部它已经这样做了;事实上,clone()
正在返回一个特定的对象,该对象已被上传到Object
,所有Java对象都从该对象继承。但是,编译器不会更改您为clone()
的返回值赋值的变量的类型。
由于你已经知道了你想要上课的课程,所以没有任何理由你不能自己去做。
答案 1 :(得分:1)
Java是许多修订和稍微奇怪的设计选择的结果。出于某种原因,Java的设计者决定clone
总是返回Object
类型的东西,而正如你自己指出的那样getClass
方法总是会返回类型为Class<? extends A>
的东西,如果方法在A类上调用。
Java的共变量返回类型允许您覆盖clone
以获得正确的返回类型,但标准做法是使用此短路并在调用clone
后强制转换对象。