为什么克隆数组没有类型转换?

时间:2013-03-19 13:35:58

标签: java arrays clone

发现我可以执行以下操作:

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));
        }

    }

为什么呢?什么时候介绍?

3 个答案:

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

Previouslyclone被定义为返回Object。对于协变返回类型有利的问题尤其如此,

答案 2 :(得分:3)

Java 5引入了协变返回类型,它允许任何代码(包括您自己的代码)利用它们。一般功能允许重写方法声明返回类型,该返回类型是原始返回类型的子类型。请注意,声明的变量类型必须正确才能生效。例如,以下内容无法编译:

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