¿Por qué el comstackdor de Kotlin requiere el inicializador explícito de la propiedad var?

No puedo entender la siguiente pieza de documentation de Kotlin:

The initializer, getter and setter are optional. Property type is optional if it can be infernetworking from the initializer or from the base class member being overridden. Examples: var allByDefault: Int? // error: explicit initializer requinetworking, default getter and setter implied 

La única explicación de por qué el comstackdor requiere un inicializador explícito aquí (al less la única explicación que se me ocurre) es que Kotlin no tiene valores pnetworkingeterminados de properties. ¿Es correcto? Si es así, ¿por qué? En otras palabras: ¿cuál es la diferencia entre las properties de Kotlin y los campos de Java (que tienen valores pnetworkingeterminados) que no nos permite tener valores pnetworkingeterminados de properties?

Eso es simple: en Java los valores pnetworkingeterminados son 0 (cero) y null . Pero en Kotlin la mayoría de los valores no son anulables, por lo que no puede inicializarlos con null . Para los valores primitivos, podría haber una estrategia pnetworkingeterminada de initialization con ceros, pero no se hizo para ser consistente. Pero en las matrices primitivas, el valor pnetworkingeterminado es cero.

Si realmente necesita esa semántica de initialization, eche un vistazo a lateinit properties lateinit : https://kotlinlang.org/docs/reference/properties.html#late-initialized-properties .

Ese mecanismo básicamente permite iniciar un campo con null , pero luego lo libera de las aserciones nulas.

ADICIÓN

En realidad, Kotlin es muy inteligente sobre la initialization. Por ejemplo, eso funciona:

 val x: Int if(something) x = 1 else x = 2 println(x) 

Aquí kotlinc puede demostrar que x se está inicializando antes de que se use, por lo que el código está bien

Kotlin no hace nada implícitamente. No convierte types numéricos sin su instrucción específica, ni establece un valor pnetworkingeterminado o de initialization sin que sea explícito. Es una opción de layout para eliminar los errores comunes que se encontraron en los progtwigs típicos de Java. No está claro para el comstackdor si se olvidó de inicializarlo o si pretendía usar un valor pnetworkingeterminado. Como no está claro, es malo. Y, por lo tanto, probablemente resulte en errores.

Las elecciones de layout de Kotlin ayudan a eliminar errores debido a un código en el cual el comstackdor no puede ayudar a determinar si hay un error. Es filosófico y consistente en el lenguaje.

Kotlin requiere initialization antes del uso. Para los miembros, eso significa que para cuando los constructores y los inicializadores estén completos, debe tener un valor. lateinit modificador lateinit en var permite que esto se ignore en time de compilation, aunque en time de ejecución la comprobación se realiza cuando se accede a la variable. Para variables locales, cualquier twig de código debe inicializar el valor antes del acceso. Por ejemplo:

 fun stateFromAbbreviation(abbreviation: String?): String { val state: String if (abbreviation == null) { state = DEFAULT_STATE } else { state = stateMap.get(abbreviation) ?: throw IllegalStateException("Invalid state abbreviation $abbreviation") } return state } 

Aquí la variable local se puede inicializar en la instrucción if suponiendo que todas las twigs inicializan el valor. Pero en realidad, este código sería más idiomático usando el if como expresión, como por ejemplo:

 fun stateFromAbbreviation(abbreviation: String?): String { return if (abbreviation == null) { DEFAULT_STATE } else { stateMap.get(abbreviation) ?: throw IllegalStateException("Invalid state abbreviation $abbreviation") } } 
  • alerta abiertaDialog en kotlin, cómo configurar ambos posts con botones de radio
  • Al utilizar tanto publishOn como subscribeOn en un flujo, no ocurre nada
  • Error de desencryption de Phpseclib al descifrar el contenido encriptado en Java
  • AsyncTask sin fugas
  • Spring REST, Kotin y los parameters primitivos pnetworkingeterminados conducen a un error
  • ¿Cómo propagar arguments pnetworkingeterminados entre funciones en Kotlin?
  • Separar cadena cada n caracteres
  • Soporte autocompletado para kotlin en Eclipse-neon
  • MissingMethodInvocationException probando una class abierta en Kotlin
  • anko doAsync onComplete
  • ¿Cómo resolver esta "reference no resuelta" cuando he definido la function?