Desde o Scala 2.7.2, existe algo chamado Manifest
que é uma solução alternativa para o apagamento de tipo do Java. Mas como Manifest
funciona exatamente e por que / quando você precisa usá-lo?
O blog pós Manifests: reificado Tipos de Jorge Ortiz explica algumas delas, mas não explica como usá-lo em conjunto com limites de contexto .
Além disso, qual é ClassManifest
a diferença Manifest
?
Eu tenho algum código (parte de um programa maior, não pode incluí-lo facilmente aqui) que possui alguns avisos com relação ao apagamento de tipo; Eu suspeito que posso resolver isso usando manifestos, mas não sei exatamente como.
Respostas:
O compilador conhece mais informações sobre tipos do que o tempo de execução da JVM pode representar facilmente. Um manifesto é uma maneira do compilador enviar uma mensagem interdimensional para o código em tempo de execução sobre as informações de tipo que foram perdidas.
É semelhante à maneira como os Kleptonianos deixaram mensagens codificadas nos registros fósseis e no DNA "lixo" dos seres humanos. Devido às limitações dos campos de velocidade da luz e ressonância gravitacional, eles não conseguem se comunicar diretamente. Mas, se você sabe como sintonizar o sinal deles, pode se beneficiar de maneiras que não pode imaginar, ao decidir o que comer no almoço ou qual número de loteria jogar.
Não está claro se um manifesto beneficiaria os erros que você está vendo sem saber mais detalhes.
Um uso comum dos manifestos é fazer com que seu código se comporte de maneira diferente com base no tipo estático de uma coleção. Por exemplo, e se você quisesse tratar uma [String] de lista diferente de outros tipos de uma lista:
Uma solução baseada em reflexão para isso provavelmente envolveria a inspeção de cada elemento da lista.
Um limite de contexto parece mais adequado ao uso de classes de tipo no scala e é bem explicado aqui por Debasish Ghosh: http://debasishg.blogspot.com/2010/06/scala-implicits-type-classes-here-i.html
Os limites de contexto também podem tornar as assinaturas do método mais legíveis. Por exemplo, a função acima pode ser reescrita usando limites de contexto da seguinte maneira:
fonte
Não é uma resposta completa, mas com relação à diferença entre
Manifest
eClassManifest
, você pode encontrar um exemplo no documento Scala 2.8Array
:Exemplo:
(Veja esta pergunta do SO para ilustração )
fonte
Um Manifest foi planejado para reificar tipos genéricos que são apagados para serem executados na JVM (que não suporta genéricos). No entanto, eles tinham alguns problemas sérios: eram muito simplistas e não podiam dar suporte total ao sistema de tipos da Scala. Eles foram descontinuados no Scala 2.10 e são substituídos por
TypeTag
s (que são essencialmente o que o próprio compilador Scala usa para representar tipos e, portanto, oferece suporte total aos tipos Scala). Para mais detalhes sobre a diferença, consulte:Em outras palavras
Antes de 04-01-2013, quando o Scala 2.10 foi lançado .
fonte
Vamos também chck
manifest
emscala
sources (Manifest.scala
), vemos:Portanto, com relação ao seguinte código de exemplo:
podemos ver que a
manifest
function
pesquisa de um implícitom: Manifest[T]
que satisfaz o quetype parameter
você fornece em nosso código de exemplo eramanifest[String]
. Então, quando você chama algo como:você está verificando se a corrente
implicit m
que você definiu em sua função é do tipomanifest[String]
e, comomanifest
é uma função do tipomanifest[T]
, procuraria por um específicomanifest[String]
e descobriria se existe um implícito.fonte