TypeTrees
This library is intended to solve the use case of getting the erased types of a (generic) parameter. Something which was possible in Scala 2 with TypeTag
and is now a bit more complex with Scala 3.
This is implemented thanks to a macro.
Warning: for most use cases, it needs to be part of a inline
method.
Get it
libraryDependencies += "io.github.gaeljw" % "typetrees" % typetreesVersion
<dependency>
<groupId>io.github.gaeljw</groupId>
<artifactId>typetrees_${scala.version}</artifactId>
<version>${typetrees.version}</version>
</dependency>
Usage
import io.github.gaeljw.typetrees.TypeTreeTag
import io.github.gaeljw.typetrees.TypeTreeTagMacros.typeTreeTag
import scala.reflect.ClassTag
val tag: TypeTreeTag = typeTreeTag[T] // (1)
val classTag: ClassTag[_] = tag.self // (2)
val actualClass: Class[_] = classTag.runtimeClass
val typeParameters: List[TypeTreeTag] = tag.args // (3)
-
Get a
TypeTreeTag
for a generic typeT
-
Get a
ClassTag
for this type -
Get a
TypeTreeTag
for each type parameters if any
Examples
The main usage is as follows, within a generic inline
method:
inline def someGenericMethod[T](t: T): String = {
val tag: TypeTreeTag = typeTreeTag[T]
s"I have been called with a parameter of type $tag"
}
Or:
inline def someGenericMapMethod[K,V](map: Map[K,V]): String = {
val keyTag: TypeTreeTag = typeTreeTag[K]
val valueTag: TypeTreeTag = typeTreeTag[V]
s"I have been called with a Map where key is of type $keyTag and value is of type $valueTag"
}
It can also be applied to non generic types: in such case it doesn’t need to be part of a inline def
.