2013-03-19 59 views
4

发现我可以做如下:为什么克隆数组没有类型转换?

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

请记住,这是一个浅层克隆而不是深层克隆。不知道我是否理解“为什么?”这个问题为什么支持这个问题?这是个问题吗? – nattyddubbs 2013-03-19 13:39:44

回答

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中引入的。

3

对于T[]类型的数组,方法clone的返回类型为T[]。由于Object.clone()回报Object这样定义需要协变返回类型,在Java 5

Previously中引入的,clone被定义为返回Object。特别是对于协变类型返回类型有什么好处,

3

Java 5引入协变返回类型,它允许任何代码(包括您自己的)利用它们。通用特性允许覆盖方法声明返回类型,该类型是原始返回类型的子类型。请注意,变量的声明类型必须正确才能正常工作。例如,以下不编译:

Object vals1 = {1.2, 2.3, 3.4, 4.5}; 
double[] vals2; 
vals2 = vals1.clone();