원본과 별도로 배열을 만들고 싶다면 copyOf() 함수를 사용해야 한다. copyOf()는 필요시 다른 크기의 배열을 만들어내기도 한다.
val numbers = squares.copyOf() numbers[0] = 1000 // squares에는 영향이 없다 squares.copyOf(2) // 뒤가 잘림: 1, 4 squares.copyOf(5) // 부족한 부분에 0이 채워짐: 1, 4, 9, 16, 0
배열 타입 변수에 타입이 다른 배열을 대입할 수 없다는 점을 기억하라. 다음 코드는 컴파일 오류를 발생시킨다.
var a = arrayOf(1, 4, 9, 16)
a = arrayOf("one", "two") // Error: can't assign Array<String> to Array<Int>
자바 vs. 코틀린 자바에서는 상위 타입의 배열에 하위 타입의 배열을 대입할 수 있었다. 배열이 가변 데이터 구조이므로 이런 대입은 런타임 시 문제를 발생시킬 수 있다.
Object[] objects = new String[] { "one", "two", "three" };
objects[0] = new Object(); // ArrayStoreException 예외가 발생함
이런 이유로 코틀린 배열 타입은 (자신과 같은 타입을 제외하고) 모든 다른 배열 타입과 서로 하위 타입 관계가 성립하지 않는다고 간주되며, 이에 따라 앞에서 본 것 같은 대입도 금지된다. 코틀린에서 String은 Any의 하위 타입이지만 Array<String>은 Array<Any>의 하위 타입이 아니다.
val strings = arrayOf("one", "two", "three")
val objects: Array<Any> = strings // 예외