如何获取带类型参数的Kotlin方法名称?
获取带泛型参数的方法名称
可以通过调整方法引用的写法解决这个问题,以下是几种可行方案:
1. 显式指定泛型类型参数
如果能确定泛型方法的具体类型参数,直接在方法引用后明确指定即可,编译器就能正常解析:
class A { fun <T> foo(): T { /* ... */ } fun bar() { val fooName = this::foo<Any>.name } }
这里用Any作为占位类型,你也可以根据实际场景替换为具体的类型。
2. 使用泛型投影绕过类型推断
如果不需要绑定特定的泛型类型,可将方法引用强制转换为KFunction<*>,这样编译器会跳过泛型参数的推断要求:
class A { fun <T> foo(): T { /* ... */ } fun bar() { val fooName = (this::foo as KFunction<*>).name } }
这种方式不会影响方法名称的获取,因为JVM泛型是类型擦除的,方法的实际名称依然是foo。
3. 通过类反射查找方法
还可以利用Kotlin的反射API直接从类中查找目标方法,适合需要处理多个方法或重载场景的情况:
import kotlin.reflect.full.declaredFunctions class A { fun <T> foo(): T { /* ... */ } fun bar() { val fooName = A::class.declaredFunctions .find { it.name == "foo" && it.parameters.size == 1 } // 参数数量判断区分重载 ?.name } }
注意如果存在同名重载方法,需要通过参数列表、返回类型等条件进一步筛选。
内容的提问来源于stack exchange,提问作者ergysdo
相关产品推荐
相关产品推荐

