Recibo un error cuando pongo el tipo y el tamaño de una matriz de clases
Yo he tratado:
fun main(args :Array<String>) { class modul() { var nommodul: String? = null var coeff: Int? = null var note: Int? = null } var releve class notes() { var releve: array<modul>(10){""} here the erreur } }En primer lugar, su código tiene varios errores. Esto podría ser un problema de MCVE y/o de copiar y pegar, pero necesito abordarlos antes de comenzar con los arreglos.
var releve antes de que la clase de notes no esté permitida. No lo asigna, no declara un tipo, y el compilador se quejará si copia y pega el código de su pregunta.
En segundo lugar, la matriz var en sí misma: la Array está en mayúsculas y la inicialización está separada. Esto sería más válido ( tenga en cuenta que esto todavía no funciona ; la solución para eso viene más adelante en esta respuesta):
var releve: Array<modul> = Array(10) {...} // or var releve = Array<modul>(10) {...}Y lo último antes de comenzar con la matriz en sí: lea las convenciones del lenguaje , especialmente las de nomenclatura. Todas sus clases deben comenzar con una letra mayúscula.
Los arreglos de Kotlin son bastante diferentes de los arreglos de Java en muchos aspectos, pero el más notable es que la inicialización directa del arreglo también requiere un inicializador.
Se espera que los corchetes creen una nueva instancia, lo cual no es así. Creas un String, que no es, en tu caso, un modul .
Hay varias formas de arreglar esto dependiendo de cómo quieras hacerlo.
Si tiene instancias que desea agregar a la matriz, puede usar arrayOf :
arrayOf(modulInstance, modulInstance2, ...)Si desea crearlos directamente, puede usar su enfoque:
var releve = Array(10) { modul() } Una nota sobre ambos: debido a la inicialización, obtiene una inferencia de tipo automática y no necesita declarar explícitamente <modul>
Si desea matrices de estilo Java, necesita una matriz de valores nulos.
Hay dos maneras de hacer esto:
var releve = arrayOfNulls<modul>(10) // or var releve = Array<modul?>(10) { null }Recomiendo encarecidamente el primero, porque es más limpio. Sin embargo, no estoy seguro de si hay una diferencia en cuanto al rendimiento.
Tenga en cuenta que esto infiere un tipo anulable para la matriz, pero le permite trabajar con matrices de forma similar a Java. La inicialización desde este punto es como Java: releve[i] = modul() . Este enfoque es principalmente útil si tiene argumentos que desea agregar a cada una de las clases y necesita hacerlo manualmente. El uso de inicializadores manuales también le proporciona un índice ( consulte la documentación ) que puede usar durante la inicialización.
Tenga en cuenta que si está usando un ciclo for para inicializar, también puede usar Array(10) { YourClass() } y usar el índice proporcionado si necesita información sensible al índice, como argumentos de función. Por supuesto, no hay nada de malo en usar un bucle for, pero puede ser más limpio.
aquí un ejemplo de inicialización de matriz kotlin:
matriz de método de biblioteca
val strings = arrayOf("January", "February", "March")matrices primitivas
val numbers: IntArray = intArrayOf(10, 20, 30, 40, 50)Inicialización tardía con índices
val array = arrayOfNulls<Number>(5) for (i in array.indices) { array[i] = i * i }Ver Kotlin - Tipos básicos para más detalles