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

    }

なんで?導入されたのはいつ?

4

3 に答える 3

9

JLS のセクション 10.7から、配列メンバー:

配列型のメンバーは、次のすべてです。

...

  • cloneクラス Object 内の同じ名前のメソッドをオーバーライドし、チェック例外をスローしないパブリック メソッド。配列型 T[] の clone メソッドの戻り値の型は T[] です。

3 版の同じセクションは同じ内容です。

2 版では、配列型は overrideclone()をオーバーライドすると述べていますが、その時点では戻り値の型の共分散がなかったため、 を返すことはできませんでしたT[]

したがって、基本的には1.5で導入されました。

于 2013-03-19T13:38:18.353 に答える
3

Java 5 では、共変の戻り値の型が導入されました。これにより、任意のコード (独自のものを含む) でそれらを利用できます。一般的な機能により、オーバーライド メソッドは、元の戻り値の型のサブタイプである戻り値の型を宣言できます。これが機能するには、変数の宣言された型が正しい必要があることに注意してください。たとえば、次はコンパイルされません。

Object vals1 = {1.2, 2.3, 3.4, 4.5};
double[] vals2;
vals2 = vals1.clone();
于 2013-03-19T13:39:47.267 に答える
3

clone型の配列に対するメソッドの戻り値の型T[]は ですT[]。このようなObject.clone()戻り値Objectの定義には、Java 5 で導入された共変の戻り値の型が必要になるためです。

以前は、cloneを返すように定義されていましたObject。これは特に、共変の戻り値の型が適している種類の問題です。

于 2013-03-19T13:39:43.607 に答える