发现我可以执行以下操作:
package test.java.lang;
import java.util.Arrays;
public class Tester_ArrayCloning_01 {
public static void main(String[] args) {
double[] vals1 = {1.2, 2.3, 3.4, 4.5};
double[] vals2;
// vals2 = (double[])vals1.clone(); // was thinking should do so
vals2 = vals1.clone(); // but happened can do so
System.out.println(Arrays.toString(vals2));
}
}
为什么呢?什么时候介绍?
答案 0 :(得分:9)
来自section 10.7 of the JLS, array members:
数组类型的成员是以下所有成员:
...
- 公共方法
clone
,它覆盖类Object中的同名方法,并且不会抛出任何已检查的异常。数组类型T []的克隆方法的返回类型是T []。
same section in the third edition具有相同的内容。
second edition表示数组类型覆盖clone()
,但此时没有返回类型协方差,因此他们无法返回T[]
。
所以基本上它是在1.5中引入的。
答案 1 :(得分:3)
类型为clone
的数组的方法T[]
的返回类型为T[]
。由于Object.clone()
返回Object
这样的定义需要协变返回类型,这是Java 5中引入的。
Previously,clone
被定义为返回Object
。对于协变返回类型有利的问题尤其如此,
答案 2 :(得分:3)
Java 5引入了协变返回类型,它允许任何代码(包括您自己的代码)利用它们。一般功能允许重写方法声明返回类型,该返回类型是原始返回类型的子类型。请注意,声明的变量类型必须正确才能生效。例如,以下内容无法编译:
Object vals1 = {1.2, 2.3, 3.4, 4.5};
double[] vals2;
vals2 = vals1.clone();