Estou tentando entender o objetivo da reified
palavra - chave, aparentemente está nos permitindo refletir sobre os genéricos .
No entanto, quando deixo de fora, funciona tão bem. Alguém quer explicar quando isso faz uma diferença real ?
generics
kotlin
kotlin-reified-type-parameters
hl3mukkel
fonte
fonte
Respostas:
TL; DR: O que é
reified
bom paraNo corpo de uma função genérica como
myGenericFun
, você não pode acessar o tipoT
porque ele está disponível apenas em tempo de compilação, mas apagado em tempo de execução. Portanto, se você quiser usar o tipo genérico como uma classe normal no corpo da função que você precisa para passar explicitamente a classe como um parâmetro , como mostrado namyGenericFun
.Se você criar uma
inline
função com um reificadaT
no entanto, o tipo deT
pode ser acessado mesmo em tempo de execução e, portanto, você não precisa passar oClass<T>
adicionalmente. Você pode trabalhar comT
como se fosse uma classe normal, por exemplo, você pode querer verificar se uma variável é uma instânciaT
, que você pode facilmente fazer em seguida:myVar is T
.Essa
inline
função com oreified
tipoT
tem a seguinte aparência:Como
reified
funcionaVocê só pode usar
reified
em combinação com umainline
função . Essa função faz com que o compilador copie o bytecode da função para todos os locais em que a função está sendo usada (a função está sendo "embutida"). Quando você chama uma função embutida com o tipo reificado, o compilador conhece o tipo real usado como argumento de tipo e modifica o bytecode gerado para usar diretamente a classe correspondente. Portanto, chamadas comomyVar is T
torne-myVar is String
se (se o argumento de tipo fosseString
) no bytecode e no tempo de execução.Exemplo
Vamos dar uma olhada em um exemplo que mostra o quão útil
reified
pode ser. Queremos criar uma função de extensãoString
chamada chamadatoKotlinObject
que tenta converter uma string JSON em um objeto Kotlin simples com um tipo especificado pelo tipo genérico da funçãoT
. Podemos usarcom.fasterxml.jackson.module.kotlin
isso e a primeira abordagem é a seguinte:a) Primeira abordagem sem tipo reificado
O
readValue
método usa um tipo para o qual ele deve analisar oJsonObject
. Se tentarmos obter oClass
parâmetro typeT
, o compilador reclama: "Não é possível usar 'T' como parâmetro do tipo reificado. Use uma classe."b) Solução alternativa com
Class
parâmetro explícitoComo solução alternativa, o
Class
deT
pode ser um parâmetro de método, que é usado como argumento parareadValue
. Isso funciona e é um padrão comum no código Java genérico. Pode ser chamado da seguinte maneira:c) O caminho Kotlin:
reified
O uso de uma
inline
função com oreified
parâmetro typeT
permite implementar a função de maneira diferente:Não há necessidade de levar o
Class
deT
, adicionalmente,T
pode ser usado como se fosse uma classe comum. Para o cliente, o código fica assim:Nota importante: Trabalhando com Java
Uma função embutida com o
reified
tipo não pode ser chamada do código Java .fonte
SIMPLES
* reified é dar permissão para usar no momento da compilação (para acessar T dentro da função)
por exemplo:
usando como:
fonte