¿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?> 
  • Kotlin: el range For-loop debe tener un método 'iterator ()'
  • ¿Cuál es el propósito de una statement de object dentro de una class sellada en Kotlin?
  • Sobrecarga la ambigüedad de la resolución al llamar a Http.get
  • La idea inteligente no se construye cuando presiono Ejecutar
  • Comprobación de conectividad no funciona en Android Oreo Kotlin
  • ¿Cómo inyectar NativeModules no estáticos y bajo demanda en React Native Android?
  • anko doAsync onComplete
  • ¿Cómo lanzar Any a una list en Kotlin?
  • Kotlin - Cómo concatenar correctamente una Cadena
  • Android Spinner getDropDownView repite elementos después de la selección
  • Animar (desplazar) un ViewGroup bloquea vistas no relacionadas desde la animation hasta que finaliza