Não tenho certeza de qual é a diferença entre um IntArray
e um Array<Int>
em Kotlin e por que não posso usá-los de forma intercambiável:
Eu sei que se IntArray
traduz em int[]
quando direcionar o JVM
, mas o que significa Array<Int>
?
Além disso, você também pode ter String[]
ou YourObject[]
. Por que Kotlin tem classes do tipo {primitive}Array
quando praticamente qualquer coisa pode ser organizada em uma matriz, não apenas primitivas.
Array<Int>
compila paraInteger[]
(se o compilador não otimizar isso)Respostas:
Array<Int>
é umInteger[]
sob o capô, enquantoIntArray
é umint[]
. É isso aí.Isso significa que quando você coloca um
Int
em umArray<Int>
, ele sempre será encaixotado (especificamente, com umaInteger.valueOf()
chamada). No caso deIntArray
, nenhum boxing ocorrerá, porque se traduz em um array primitivo Java.Além das possíveis implicações de desempenho acima, também há conveniência a ser considerada. Matrizes primitivas podem não ser inicializadas e terão
0
valores padrão em todos os índices. É por isso queIntArray
e o resto das matrizes primitivas têm construtores que aceitam apenas um parâmetro de tamanho:val arr = IntArray(10) println(arr.joinToString()) // 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Em contraste,
Array<T>
não tem um construtor que leva apenas um parâmetro de tamanho: ele precisa deT
instâncias válidas e não nulas em todos os índices para estar em um estado válido após a criação. ParaNumber
tipos, pode ser um padrão0
, mas não há como criar instâncias padrão de um tipo arbitrárioT
.Portanto, ao criar um
Array<Int>
, você pode usar o construtor que também recebe uma função de inicializador:val arr = Array<Int>(10) { index -> 0 } // full, verbose syntax val arr = Array(10) { 0 } // concise version
Ou crie um
Array<Int?>
para evitar ter que inicializar todos os valores, mas depois você será forçado a lidar com osnull
valores possíveis toda vez que ler o array.val arr = arrayOfNulls<Int>(10)
fonte
int[]
éIntArray
,Integer[]
éArray<Int>
e assim por diante, onde está essa nova classe misteriosa? É a mesma coisa, apenas a sintaxe é diferente.int[]
também é classe, aliás.É importante notar que usar o
*
operador spread ( ) em avararg
retornará umIntArray
. Se precisar de umArray<Int>
, você pode converter o seuIntArray
usando.toTypedArray()
.fonte
Arrays no Kotlin são classes (não tipos "especiais" como Java).
O stdlib do Kotlin fornece classes de propósito especial para arrays primitivos JVM a fim de melhorar a integração e o desempenho da linguagem Java.
A regra prática seria usar,
Array<T>
exceto se causar um problema ao misturar com o código Java existente ou se deveria ser chamado a partir de classes Java. Só para constar, eu nunca precisei usarIntArray
.Você pode verificar a documentação do idioma sobre este assunto aqui: https://kotlinlang.org/docs/reference/basic-types.html#arrays
fonte
Int
,Float
, etc, uma vez que Kotlin não tem um tipo diferente deBoolean
ouboolean
. Em termos de matrizes, presumo queArray<Int>
seja diferente deIntArray
. Pessoalmente, sempre usei o último, pois nunca me incomodou, mas talvez Kotlin tenha uma otimização adicional da qual não estou ciente. Se você está programando apenas em kotlin, não vejo nenhum caso em que você precise de um em vez do outro, mas o array primitivo ainda pode ter seus benefícios.