¿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") } } 
  • time de espera de connection: conectar consultar logging de IDE
  • ClassCastException con el método bindService de ServiceTestRule
  • Escribir en el file después del partido en Kotlin
  • Definición del tamaño a un tipo de matriz personalizada en Android Kotlin
  • Kotlin: No se pueden aplicar dos condicionales a la vez. Verificar con el estilo de function de "cuerpo de retorno".
  • Spring Boot with AsyncRestTemplate Netty Client falla
  • ExpandableListView no se muestra en mi actividad
  • Clases de almacenamiento en lenguaje de progtwigción Kotlin
  • Lamentablemente, el "nombre de la aplicación" se detuvo debido a la biblioteca de Jsoup
  • ¿Cómo represento una tabla de unión con un campo adicional usando eBean y Kotlin?
  • Android create listitem / object con información guardada de otra actividad