我应该如何在内部类中生成类T?

问题描述 投票:0回答:1
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”。我该如何解决这个问题?

kotlin generics
1个回答
0
投票

如果我理解正确的话,给定一个类型,您想知道其

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])
© www.soinside.com 2019 - 2024. All rights reserved.