¿Por qué Android Studio convierte algunos types primitivos de Kotlin como operador condicional / seguro?

Sé que no debería hacer preguntas sobre "por qué" aquí, pero espero que esta sea una de las excepciones permitidas ya que es una pregunta relacionada con el código. Simplemente no sé las consecuencias aún en este nuevo idioma.

Estoy usando Android studio 3.0 canary 3 y estoy convirtiendo el código Java en Kotlin. Gran parte del código se está convirtiendo manualmente, pero otro código lo estoy convirtiendo al copyr / pegar java en un nuevo file de Kotlin.

Hasta aquí todo bien. Sin embargo, comencé a notar esto:

Código Java:

class MyClass { private String userId; private Long newFolderId; private int oldFolderId; public MyClass(final String userId, final Long newFolderId, final int oldFolderId) { this.userId = userId; this.newFolderId = newFolderId; this.oldFolderId = oldFolderId; } } 

Copio este pequeño fragment de código a Kotlin, y se convierte automáticamente a esto:

 class MyClass(private val userId: String, private val newFolderId: Long?, private val oldFolderId: Int) 

Entonces, mi pregunta en este punto es por qué Long se convirtió a Long?

Si esto es seguro, ¿no deberían TODAS las variables ser ? ? Me gusta, String? e Int?

¿Por qué solo Long ?

Además, sé que estoy aprobando esta class por mucho time, así que ¿sería malo simplemente eliminarla ? de Long, y solo lo llaman Long ?

Gracias por tu ayuda.

La pregunta es por qué Kotlin convierte los types primitivos de Kotlin como types anulables.

Primero – Kotlin no tiene types primitivos – solo optimiza la representación de algunos types básicos en la JVM cuando puede. Tipos básicos de Kotlin

Segundo: aquí es importante tener en count que está convirtiendo el código de Java a Kotlin. Entonces, su código Java y sus types son los que hacen la diferencia en la conversión.

En Java Long es class, y no tipo primitivo. En Java, long es la contraparte primitiva de Long .

¿Entonces su parámetro Long puede ser nulo en Java y se convirtió correctamente a nulo Long? Su parámetro int es de tipo primitivo en Java, no puede ser nulo, y se convierte como Int no nulable.

Si tuviera una statement de class de Java diferente

 class MyClass { private String userId; private long newFolderId; private int oldFolderId; public MyClass(final String userId, final long newFolderId, final int oldFolderId) { this.userId = userId; this.newFolderId = newFolderId; this.oldFolderId = oldFolderId; } } 

se convertiría como

 internal inner class MyClass(private val userId: String, private val newFolderId: Long, private val oldFolderId: Int) 

Como puede ver, el primitivo long se convierte en no anulable Long


¿Por qué exactamente String tipo de String no primitiva se convierte como no anulable?

Esa parte de la pregunta se basa en cierta opinión, o al less la respuesta es.

String probablemente tiene un tratamiento especial debido a su naturaleza: cadena vacía se puede utilizar como valor pnetworkingeterminado. En muchos idiomas, las cadenas tienen un tratamiento y consideraciones especiales. La mayoría de las veces prefiere que String variable String no sea nulable. Dado que Kotlin enfatiza la security nula, es lógico que la conversión de código pnetworkingeterminada trate a String como no nulo.


En lo que respecta a la security nula. Cada parte del código cuando se puede usar un tipo que no admite nulos es más seguro y más simple de manejar que el código que usa el tipo que admite nulos. Entonces, ¿ Long es preferible a Long? donde corresponda.

  • ¿Cómo configurar Jacoco con Spek en un proyecto múltiple?
  • "Algunas bibliotecas de Kotlin conectadas a este proyecto tienen un formatting no compatible. Actualice las bibliotecas o el complemento"
  • El complemento gradle de Android se queja de un error de traducción no detectada
  • Cloud.orbit.exception.UncheckedException: no sé cómo manejar el estado
  • Solicitud en Android siempre dando exception de time de espera del socket
  • Setter for field se elimina por tipo de proyección
  • Declarando collections vacías en Kotlin
  • Deserialization de KS JS JSON
  • Kotlin KDoc: ¿Documentación?
  • ¿TreeWalker no está trabajando con Kotlin / Gradle?
  • Genéricos de Kotlin: Kotlin no reconoce mi class con la inheritance correcta