Há uma função que desejo chamar em uma biblioteca de terceiros:
fun foo(strings: Array<String>)
O array strings
é usado apenas para leitura, ou seja, foo
não grava nele.
Agora, quero escrever uma função minha, assim:
fun bar(vararg vstrings: String) {
do some things...
foo(vstrings)
do some more things...
}
Mas a foo(vstrings)
chamada resulta em um erro de compilação:argument type mismatch: actual type is 'Array<CapturedType(out String)>', but 'Array<String>' was expected.
Não consigo alterar a assinatura de foo
. Como posso passar esse parâmetro vararg como um array?
Isso ocorre porque o parâmetro vararg é do tipo
Array<out String>
, nãoArray<String>
. Veja também a especificação . Acho que isso é para evitar que você modifique os elementos do array, o que é quase sempre incorreto.Você pode criar uma cópia do array e então passar a cópia para
foo
.Em Kotlin/JS, você pode chamar
vstrings.copyOf()
diretamente, mas isso não está disponível em outras plataformas por algum motivo.