import java.lang.reflect.ParameterizedType
fun main() {
val outGeneric = object : OutGeneric<Human>() {}
outGeneric.innerGeneric.parameter()
}
open class Human(val name: String = "Bob")
abstract class InnerGeneric<in T : Human>() {
fun parameter() {
println(javaClass.genericSuperclass.typeName)
println((javaClass.genericSuperclass as ParameterizedType).actualTypeArguments.toList())
}
}
abstract class OutGeneric<in T : Human> {
val innerGeneric = object : InnerGeneric<T>() {}
}
我想在
InnerGeneric
类中获得真实类型。我希望这段代码会打印“Human”,但它却打印“T”。我该如何解决这个问题?
如果我理解正确的话,给定一个类型,您想知道其
innerGeneric
属性的类型的类型参数。虽然在 OutGeneric<Human>
的情况下可能很明显,但如果给定的类型继承自 OutGeneric
,则不会很明显。您需要遍历继承树才能找到答案。
Guava 的
TypeToken
(不要与 GSON 中的混淆)有一个 resolveType
方法可以执行此操作。
val outGeneric = object : OutGeneric<Human>() {}
// create a type token
val token = TypeToken.of(outGeneric.javaClass)
// if it is not an anonymous type, write the type out completely
// val token = object: TypeToken<OutGeneric<Human>>() {}
val resolvedToken = token.resolveType(
// we want to get the return type of the getter of innerGeneric
OutGeneric<*>::innerGeneric.javaGetter!!.genericReturnType
)
// now token is the type InnerGeneric<Human>
println((resolvedToken.type as ParameterizedType).actualTypeArguments[0])