Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Reification via a Manifest example
class ReifiedManifest[T <: Any : Manifest](value: T) {
val m = manifest[T] // So at this point we have the manifest for the Parameterized type
// At which point we could either do an if() expression on what type is contained in our manifest
if (m equals manifest[String]) {
println("The manifest contains a String")
} else if (m <:< manifest[AnyVal]) { // A subtype check using the <:< operation on the Manifest trait
println("The manifest contains a subtype of AnyVal")
} else if (m <:< manifest[AnyRef]) {
println("The manifest contains a subtype of AnyRef")
} else {
println("Not sure what type is contained ?")
}
// or we could grab the erased type from the manifest and do a match on some attribute of the type
m.erasure.toString match {
case "class java.lang.String" => println("ERASURE: pattern matches on a String")
case "double" | "int" => println("ERASURE: pattern matches on a Numeric value.")
case x => println("ERASURE: has picked up another type not spec'd in the pattern match: " + x)
}
}
new ReifiedManifest("Test") // Contains a String / matches on a String
new ReifiedManifest(1) // Contains an AnyVal / matches on a Numeric
new ReifiedManifest(1.2) // Contains an AnyVal / matches on a Numeric
new ReifiedManifest(BigDecimal("3.147")) // Contains an AnyRef / matches on a an unspecified type
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.