O que significa um único ponto de exclamação no Kotlin? Eu já vi isso algumas vezes, especialmente ao usar APIs Java. Mas não consegui encontrá-lo na documentação nem no StackOverflow.
Eles são chamados de tipos de plataforma e significam que o Kotlin não sabe se esse valor pode ou não ser null
e cabe a você decidir se é anulável ou não.
Em poucas palavras, o problema é que qualquer referência vinda de Java pode ser nula, e o Kotlin, por ser nulo por design seguro, forçou o usuário a verificar nulos todos os valores Java ou a usar chamadas seguras (
?.
) ou asserções não nulas (!!
) Esses recursos são muito úteis no mundo puro do Kotlin, tendem a se transformar em um desastre quando você precisa usá-los com muita frequência na configuração Kotlin / Java.É por isso que adotamos uma abordagem radical e tornamos o sistema de tipos do Kotlin mais relaxado no que diz respeito à interoperabilidade Java: agora as referências provenientes de Java têm tipos especialmente marcados - Kotlin Blog
platform types
É a notação para os tipos de plataforma :
T!
significa "T
ouT?
"fonte
T
significa "T!
ouT?
"T
foi tornado "não anulável", e o resto foi mais ou menos arbitrárioUm tipo anotado com
!
é chamado de tipo de plataforma , que é um tipo proveniente de Java e, portanto, provavelmente pode sernull
. É o que o compilador Kotlin deduz por padrão ao chamar Java (nos casos mais básicos, os métodos Java podem ser anotados para contornar isso). Você deve manipular os tipos de plataforma como tipos anuláveis , a menos que você certamente saiba que a API específica nunca retornaránull
. O compilador permite que tipos de plataforma sejam atribuídos a variáveis de tipos anuláveis e não nulos.Você pode se referir aos tipos de plataforma como "tipos de nulidade desconhecida ". Também é importante saber que você não pode usar o tipo de marca de exclamação para seus próprios tipos, não faz parte da sintaxe do Kotlin, é apenas uma notação .
fonte
Os nomes de tipo ou classe que terminam com um único ponto de exclamação
!
são chamados de Tipos de plataforma no Kotlin. Você os encontra quando está trabalhando no Kotlin com código Java antigo que não contém informações de nulidade.Por exemplo:
Informações anuláveis: Tipo anulável
@Nullable String
em Java é considerado comoString?
por Kotlin.Informações não nulas: Tipo não nulo
@NotNull String
em Java é considerado comoString
por Kotlin.Sem informação: Tipo de plataforma
String
sem anotações em Java é considerado comoString!
pelo Kotlin.Como lidar com tipos de plataforma?
Você pode trabalhar com um tipo de plataforma como nulo ou não nulo. O compilador permitirá que você chame todos os métodos nesse tipo. É sua responsabilidade como usá-los. Se você souber que o valor pode ser nulo, compare-o com nulo antes de chamar os métodos. Se você souber que não é nulo, poderá usá-lo diretamente, mas como em Java, você receberá uma exceção se sua suposição sobre a nulidade estiver errada.
Observe que você não pode declarar tipos de plataforma no código Kotlin, eles vêm apenas do código Java.
Tipos de herança e plataforma
Ao substituir os métodos Java no código Kotlin, você tem a opção de declarar parâmetros e retornar tipos como nulos ou não nulos. Você precisa escolher isso com sabedoria, porque se você decidir tornar os parâmetros não nulos, o compilador Kotlin gera asserções não nulas para esses parâmetros não nulos. E na próxima vez que você acessar esse código Kotlin de volta do Java e passar um valor nulo, receberá uma exceção.
Espero que ajude a tirar todas as suas dúvidas sobre os Tipos de Plataforma.
fonte
Como mencionado por s1m0nw1,
T!
significaT or T?
. A próxima pergunta é: o que éT?
? Isso está bem documentado em https://kotlinlang.org/docs/reference/null-safety.html . O Kotlin não permite que certos elementos sejamnull
, por exemploString
, diferentes do Javafonte
Trecho dos tipos de plataforma no Kotlin :
Por exemplo:
Significa apenas o seguinte: "A coleção Java de T pode ser mutável ou não, pode ser anulável ou não ".
Espero que isto ajude.
fonte