Signo de exclamación único en Kotlin

141

¿Qué significa un solo signo de exclamación en Kotlin? Lo he visto varias veces, especialmente cuando uso las API de Java. Pero no pude encontrarlo en la documentación ni en StackOverflow.

Mibac
fuente

Respuestas:

155

Se llaman tipos de plataforma y significan que Kotlin no sabe si ese valor puede o no serlo, nully depende de usted decidir si es anulable o no.

En pocas palabras, el problema es que cualquier referencia proveniente de Java puede ser nula, y Kotlin, por su diseño nulo-seguro, obligó al usuario a verificar nulo cada valor de Java, o usar llamadas seguras ( ?.) o afirmaciones no nulas ( !!) Al ser características muy útiles en el mundo puro de Kotlin, tienden a convertirse en un desastre cuando tienes que usarlas con demasiada frecuencia en la configuración de Kotlin / Java.

Es por eso que tomamos un enfoque radical e hicimos que el sistema de tipos de Kotlin fuera más relajado cuando se trata de interoperabilidad de Java: ahora las referencias provenientes de Java tienen tipos especialmente marcados - Kotlin Blog

Mibac
fuente
2
Todo está bien dicho y hecho. Sin embargo, no me siento bien llamándoloplatform types
JaydeepW
61

Es la notación para los tipos de plataforma :

T!significa " To T?"

voddan
fuente
¿Por qué no Tsignifica " T!o T?"
Primero el
T! significa no anulable, T? significa anulable. Por qué Kotlin no hace eso ...
Primero
44
Debido a que el mejor valor predeterminado es "no anulable" por razones obvias, y es un buen diseño para que el valor predeterminado sea la firma de tipo más corta. Así Tse hizo "no anulable", y el resto fue más o menos arbitrario
voddan
13

Un tipo con notación !se denomina tipo de plataforma , que es un tipo que proviene de Java y, por lo tanto, probablemente lo sea null. Es lo que el compilador de Kotlin infiere por defecto cuando llama a Java (para los casos más básicos, los métodos de Java pueden ser anotados para evitar esto). Debe manejar los tipos de plataforma como tipos anulables , a menos que sepa que la API en particular nunca volverá null. El compilador permite que se asignen tipos de plataforma a variables tanto de tipo anulable como no nulo.

Notación para tipos de plataforma

[...]

T!significa " T or T?" [...]

Puede referirse a los tipos de plataforma como "tipos de nulabilidad desconocida ". También es importante saber que no puede usar el tipo marcado con exclamación para sus propios tipos, no es parte de la sintaxis de Kotlin, es solo una notación .

s1m0nw1
fuente
Frases como "probablemente" no ayudan
Ewan
9

Los nombres de tipo o nombres de clase que terminan con un solo signo de exclamación !se denominan Tipos de plataforma en Kotlin. Los encuentra cuando trabaja en Kotlin con código Java antiguo que no contiene información de nulabilidad.

Por ejemplo:

Información Anulable: Tipo Anulable

@Nullable Stringen Java es considerado como String?por Kotlin.

Información no nula: tipo no nulo

@NotNull Stringen Java es considerado como Stringpor Kotlin.

Sin información: tipo de plataforma

Stringsin anotaciones en Java es considerado como String!por Kotlin.


¿Cómo lidiar con los tipos de plataforma?

Puede trabajar con un tipo de plataforma como anulable o no nulo. El compilador le permitirá llamar a todos los métodos de este tipo. Es su responsabilidad cómo usarlos. Si sabe que el valor puede ser nulo, debe compararlo con nulo antes de llamar a los métodos. Si sabe que no es nulo, puede usarlo directamente pero, como en Java, obtendrá una excepción si su suposición acerca de la nulabilidad es incorrecta.

Tenga en cuenta que no puede declarar los tipos de plataforma en el código Kotlin, solo provienen del código Java.


Herencia y tipos de plataforma

Al anular los métodos Java en el código de Kotlin, tiene la opción de declarar los parámetros y devolver los tipos como nulos o no nulos. Debe elegir esto sabiamente, porque si decide hacer que los parámetros no sean nulos, el compilador de Kotlin genera aserciones no nulas para estos parámetros no nulos. Y cuando la próxima vez que acceda a este código de Kotlin desde Java y pase un valor nulo, obtendrá una excepción.

Espero que ayude a aclarar todas sus dudas sobre los Tipos de plataforma.

Yogesh Umesh Vaity
fuente
3

Lo he visto varias veces, especialmente cuando uso las API de Java

Como se menciona por s1m0nw1, T!significa T or T?. La siguiente pregunta es: ¿qué es T?? Esto está bien documentado en https://kotlinlang.org/docs/reference/null-safety.html . Kotlin no permite que ciertos elementos sean null, por ejemplo String, a diferencia de Java

Para permitir nulos, podemos declarar una variable como cadena anulable, escrita String ?:

var b: String? = "abc"
b = null // ok

[...]

b?.length 

Esto devuelve b.length si b no es nulo, y nulo de lo contrario. El tipo de esta expresión es Int?.

serv-inc
fuente
0

Extracto de los tipos de plataforma en Kotlin :

Además de especificar explícitamente un tipo como opcional (p Person?. Ej. ), Kotlin nos presenta otra bestia, llamada Platform Type, especificada poniendo un solo signo de exclamación (p Person!. Ej .). Este concepto se ha creado por razones de compatibilidad, cuando se accede al código desde plataformas nulas y no seguras como Java. A menudo ocurre que cuando se usa una biblioteca Java, muchos métodos regresan SomeType!, ya que el compilador de Kotlin no puede inferir si el resultado es anulable o no.

Por ejemplo:

(Mutable)Collection<T>! 

Solo significa lo siguiente: " La colección Java de T puede ser mutable o no, puede ser anulable o no ".

Espero que esto ayude.

Andy Fedoroff
fuente