Respuestas:
Se llaman tipos de plataforma y significan que Kotlin no sabe si ese valor puede o no serlo, null
y 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
Es la notación para los tipos de plataforma :
T!
significa " T
o T?
"
T
significa " T!
o T?
"
T
se hizo "no anulable", y el resto fue más o menos arbitrario
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 .
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:
@Nullable String
en Java es considerado como String?
por Kotlin.
@NotNull String
en Java es considerado como String
por Kotlin.
String
sin anotaciones en Java es considerado como String!
por Kotlin.
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.
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.
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?
.
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, llamadaPlatform Type
, especificada poniendo un solo signo de exclamación (pPerson!
. 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 regresanSomeType!
, 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.
platform types