Desde Scala 2.7.2 hay algo llamado Manifest
que es una solución para el borrado de tipo Java. Pero, ¿cómo Manifest
funciona exactamente y por qué / cuándo necesita usarlo?
La publicación de blog Manifiestos: Tipos Reificados de Jorge Ortiz explica algo de esto, pero no explica cómo usarlo junto con los límites de contexto .
Además, ¿cuál es ClassManifest
, cuál es la diferencia Manifest
?
Tengo un código (parte de un programa más grande, no puedo incluirlo fácilmente aquí) que tiene algunas advertencias con respecto a la eliminación de tipo; Sospecho que puedo resolverlos usando manifiestos, pero no estoy seguro exactamente cómo.
Respuestas:
El compilador conoce más información sobre los tipos que el tiempo de ejecución de JVM puede representar fácilmente. Un manifiesto es una forma para que el compilador envíe un mensaje interdimensional al código en tiempo de ejecución sobre la información de tipo que se perdió.
Esto es similar a cómo los cleptonianos han dejado mensajes codificados en los registros fósiles y el ADN "basura" de los humanos. Debido a las limitaciones de la velocidad de la luz y los campos de resonancia gravitacional, no pueden comunicarse directamente. Pero, si sabe cómo sintonizar su señal, puede beneficiarse de maneras que no puede imaginar, al decidir qué comer para el almuerzo o qué número de lotería jugar.
No está claro si un Manifiesto beneficiaría los errores que está viendo sin conocer más detalles.
Un uso común de los manifiestos es hacer que su código se comporte de manera diferente según el tipo estático de una colección. Por ejemplo, ¿qué pasaría si quisiera tratar una Lista [Cadena] de manera diferente a otros tipos de Lista:
Una solución basada en la reflexión para esto probablemente implicaría inspeccionar cada elemento de la lista.
Un enlace de contexto parece más adecuado para usar clases de tipos en scala, y Debasish Ghosh lo explica bien aquí: http://debasishg.blogspot.com/2010/06/scala-implicits-type-classes-here-i.html
Los límites de contexto también pueden hacer que las firmas de métodos sean más legibles. Por ejemplo, la función anterior podría reescribirse usando límites de contexto de la siguiente manera:
fuente
No es una respuesta completa, pero en cuanto a la diferencia entre
Manifest
eClassManifest
, se puede encontrar un ejemplo en el 2,8 ScalaArray
de papel :Ejemplo:
(Vea esta pregunta SO para ilustración )
fuente
Un manifiesto estaba destinado a reificar tipos genéricos que se borran para ejecutarse en la JVM (que no admite genéricos). Sin embargo, tenían algunos problemas serios: eran demasiado simplistas y no podían soportar completamente el sistema de tipos de Scala. Por lo tanto, quedaron en desuso en Scala 2.10, y se reemplazan con
TypeTag
s (que es esencialmente lo que el compilador Scala usa para representar tipos y, por lo tanto, es totalmente compatible con los tipos Scala). Para más detalles sobre la diferencia, vea:En otras palabras
Antes del 2013-01-04, cuando se lanzó Scala 2.10 .
fuente
Supongamos también chck a cabo
manifest
enscala
fuentes (Manifest.scala
), vemos:Entonces, con respecto al siguiente código de ejemplo:
podemos ver que las
manifest
function
búsquedas de un implícitom: Manifest[T]
que satisface lo quetype parameter
usted proporciona en nuestro código de ejemplo fuemanifest[String]
. Entonces cuando llamas a algo como:está comprobando si la corriente
implicit m
que definió en su función es de tipomanifest[String]
y, comomanifest
es una función de tipomanifest[T]
, buscaría un específicomanifest[String]
y buscaría si existe tal implícito.fuente