Byte Buddy でリニアにネストしたパラメータ化された型を KClass 群を指定して作成するメソッド。
/**
* Creates a linearly nested parameterized type.
* ex. parameterizedType(List::class, Set::class, Class::class, String::class) -> List<Set<Class<String>>>
*/
fun parameterizedType(vararg t: KClass<out Any>): TypeDescription.Generic {
require(t.size >= 2)
val r = t.reversed().map { it.java }
var parameterizedType: TypeDescription.Generic =
TypeDescription.Generic.Builder.parameterizedType(r[1], r[0]).build()
r.drop(2).forEach { jClass ->
parameterizedType = TypeDescription.Generic.Builder.parameterizedType(
TypeDescription.Generic.Builder.rawType(jClass).build().asErasure(),
parameterizedType
).build()
}
return parameterizedType
}