2013-03-19 62 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();