Skip to content

Instantly share code, notes, and snippets.

@diesieben07
Last active May 6, 2017 14:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save diesieben07/e0c3fb762e27966ed1bb95a6573e043a to your computer and use it in GitHub Desktop.
Save diesieben07/e0c3fb762e27966ed1bb95a6573e043a to your computer and use it in GitHub Desktop.
import com.google.common.reflect.TypeToken
inline fun <reified T> typeToken(): TypeToken<T> = object : TypeToken<T>() { }
private val iterableParamType = Iterable::class.java.typeParameters[0]
private val mapKeyType = Map::class.java.typeParameters[0]
private val mapValueType = Map::class.java.typeParameters[1]
fun <T, I : Iterable<T>> TypeToken<I>.elementType(): TypeToken<T> {
@Suppress("UNCHECKED_CAST")
return resolveType(iterableParamType) as TypeToken<T>
}
fun <K, M : Map<K, *>> TypeToken<M>.keyType(): TypeToken<K> {
@Suppress("UNCHECKED_CAST")
return resolveType(mapKeyType) as TypeToken<K>
}
fun <V, M : Map<*, V>> TypeToken<M>.valueType(): TypeToken<V> {
@Suppress("UNCHECKED_CAST")
return resolveType(mapValueType) as TypeToken<V>
}
fun main(args: Array<String>) {
val listType = typeToken<List<*>>()
val listElementType = listType.elementType()
val mapType = typeToken<Map<*, *>>()
val mapKeyType = mapType.keyType()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment