如何在Kotlin中编写类似方法?替换Java Class<?>通配符的方式
Java转Kotlin:替换Class<?>通配符的正确姿势
嗨,刚好帮你理清这个问题~Java里的Class<?>无界通配符,在Kotlin里有几种等价的实现方式,我给你拆解清楚:
最直接等价的写法:星号投影Class<*>
这是和JavaClass<?>完全对应的写法,代表接受任意类型的Class对象,没有类型限制。你的方法可以改成:
private fun doit(clazz: Class<*>): String { // 这里写你的方法逻辑 }
为什么你之前的Class<Any>不行?因为Kotlin(和Java一样)里Class是不变泛型,Class<String>不能直接赋值给Class<Any>,但可以赋值给Class<*>——星号投影就对应Java的无界通配符,用来表示“我们不关心这个Class的具体泛型类型”。
更灵活的泛型函数写法
如果你的方法内部需要用到具体的泛型类型信息,可以用泛型函数的形式,这等价于Java的private <T> String doit(Class<T> c):
private fun <T> doit(clazz: Class<T>): String { // 这里可以使用泛型T做类型相关操作,比如反射创建实例等 }
这种写法的好处是,当你传入String::class.java时,编译器能自动推断出T是String,在方法内可以更安全地使用类型信息。
额外补充:Kotlin特有的KClass
如果你是在纯Kotlin环境下开发,其实更推荐使用Kotlin自带的KClass,它比Java的Class提供了更多Kotlin特有的反射API。对应的写法是:
private fun doit(kClass: KClass<*>): String { // 这里用KClass的API操作 } // 调用的时候传 String::class 而不是 String::class.java
不过如果是要和Java代码交互,还是用Class<*>更合适~
内容的提问来源于stack exchange,提问作者nllsdfx
相关产品推荐
相关产品推荐

