¿Cómo crear una matriz genérica llena de nulos en Kotlin?

Intenté esto, y el código no compiló.

class GenericClass<T>() { private var arr : Array<T>? = null { arr = Array<T>(10, { null }) } } 

Hay dos errores de comstackdor informados en este código: uno es sobre types anulables y otro sobre generics.

Tipos anulables . Kotlin impone una disciplina de references anulables, y dado que T se puede instanciar con, por ejemplo, String que hace que arr sea de tipo Array, el comstackdor no le permite poner nulos en esta matriz. Si desea valores nulos, debe cambiar el tipo a Matriz:

 class GenericClass<T>() { private var arr : Array<T?>? = null { arr = Array(10, { null }) // No need to specify type arguments again } } 

Genéricos El ejemplo anterior todavía tiene un error en time de compilation, porque estamos tratando de build una matriz de un tipo desconocido T. Tenga en count que este problema también existe en Java. La compilation de Kotlin con el código de byte JVM implica dos cosas:

  • los arguments de tipo generics se borran en el time de ejecución,
  • a exception de los arguments generics de matrices.

Esto significa que en el código de bytes Kotlin tiene que crear una matriz de algún tipo concreto, y no un tipo desconocido T. Podría crear matrices de objects cada vez que vea una matriz, pero esto no funcionaría, por ejemplo, en este caso:

 fun test() { fun foo(srts: Array<String?>) { // ... } val gc = GenericClass<String>() foo(gc.arr) } 

Aquí, en la última línea, estamos tratando de pasar el Objeto [] donde se espera String [], y obtenemos un error de time de ejecución.

Esta es la razón por la que Kotlin se niega a crear matrices de T. Puede evitar este problema suprimiendo explícitamente el sistema de types, es decir, mediante el uso de moldes de tipo:

 class GenericClass<T>() { val arr : Array<T?> { arr = Array<Any?>(10, { null }) as Array<T?> } } 

Aquí solicitamos explícitamente la creación de una matriz de Cualquiera (comstackda en Objeto []), y luego la convertimos a una matriz de T. El comstackdor emite una advertencia, pero obedece a nuestra voluntad.

Tenga en count que el ejemplo problemático anterior permanece, es decir, si pasa la matriz creada de esta manera donde se espera una matriz de cadenas, fallará en el time de ejecución.

método

 val array : Array<T?> = kotlin.arrayOfNulls<T>(size) 

de docs

 /** *Returns an array of objects of the given type with the given [size], *initialized with null values. */ public fun <reified @PureReifiable T> arrayOfNulls(size: Int): Array<T?> 
  • Base de datos de la sala Android - Referencia sin resolver @Entity y otras annotations
  • retroadaptación de kotlin: barrido de marcas simultáneas adhesivas de background GC liberado 65326 (1448 KB) objects AllocSpace, 62 objects (1736 KB),
  • 'x' no es una function al pasar parameters en Kotlin Javascript
  • Función para expresión lambda
  • Kotlin no está comprando desde src / main / kotlin mientras usa maven
  • Reflexión de KFlin KFunction - get valores de parameters
  • onCreate en la actividad padre abstracta no llamada en kotlin
  • ¿Qué es la configuration de generateStubs en Kotlin?
  • La cookie de session no persiste con JSoup
  • TornadoFX con TestFX cierra la vista después de cada TestCase
  • Establecer el icono de desbordamiento de Fragment en pnetworkingeterminado