2017-05-20 7 views

답변

2

또 다른 해결책은 drivefun drive(Array<out Car>) { ... }으로 변경하는 것입니다. 물론 이것은 드라이브 내부의 차량을 수정할 수는 없지만 복사를 피할 수 있음을 의미합니다.

0

Essencially는 가변 인자의 keywork 전에 필요 변수 이름.

fun args(vararg cars: Car) { 
    //use cars as an array 
} 
+0

vararg 키워드가 이미 존재합니다. – Tarek360

+0

두 번째 함수에 추가하려는 경우에도 컴파일 오류가 수정되지 않습니다. – Tarek360

3

정확한 오류는 다음과 같습니다

Type mismatch. 
Required: Array<Car> 
Found: Array<out Car> 

문제는 당신이 vararg cars: Car 함수 매개 변수가있을 때, 함수 내에서 그 형태는 기본적으로 인수의 읽기 전용 배열을 나타냅니다 Array<out Car>,라는 것이다 함수가 호출되었습니다. 어쨌든 vararg (Kotlin의 함수 매개 변수는 읽기 전용 val s입니다.이 함수는 매우 유사합니다)로 인수를 수정하는 것은 좋은 방법이 아닙니다.

그러나 귀하의 drive 기능에는 보통 Array<Car>이 필요합니다. 물론 물론 쓸 수 있습니다. 따라서 이러한 함수 시그니처를 유지하려면 읽기 전용 어레이의 모든 것을 포함하는 새로운 배열을 만들어야합니다. 이는 다음 구문을 사용하여 생성 될 수

drive(arrayOf(*cars)) 

이것은 가변 인자 매개 변수를 사용하는 우리가 일반적으로 어레이를 만들 arrayOf 함수 호출 및 배열의 ​​요소를 전달하는 방법은 확산 연산자를 사용 (docs here)와 같이 (carsbuy 함수 내부에 있음).

모든 것이 복잡하게 들릴 수도 있지만 실제로는 바이트 코드의 내부에서 Array.copyOf을 사용하기 때문에 매우 효율적인 솔루션입니다.

+1

나는 두 번째 함수의 매개 변수로'Array '을 쓸모가 없다는 점에서 다른 대답이 더 일반적이라고 생각한다. –