美文网首页Kotlin
使用kotlinpoet生成kotlin代码数据类型不正确的问题

使用kotlinpoet生成kotlin代码数据类型不正确的问题

作者: WuRichard | 来源:发表于2018-03-14 20:34 被阅读32次

    使用kotlinpoet生成kotlin代码的时候通常会遇到这样一个问题,比如我希望生成这样一段kotlin代码:

    var string: String? = null
    string = bundle.get("test") as %T
    

    当我直接把element.asType().asTypeName()作为参数传给%T(假如这个元素elementString类型(或者是其他需要从Java类型映射到kotlin类型的数据类型),最终会生成这样一段代码:

    var string: String? = null
    string = bundle.get("test") as java.lang.String
    

    这时候编译器就会报错,因为注解处理器是javac提供的一个工具,它只认识Java代码,所以注解处理器中的所有元素element都是Java中的数据类型,因此element.asType().asTypeName()生成的类型就是java.lang.String,然后将其强制转化成kotlin.String当然就报错了,平时不会出现这种错误是因为kotlinc在编译的时候帮我们完成了java.lang.String->kotlin.String的映射,所以没有问题。
    在kotlin的反射库kotlin-reflect源码中找到了这么一个类JavaToKotlinClassMap,大致阅读了一下源码发现这个类里面有我们想要的东西,最终我们为Element定义一个扩展方法:

        /**
         * 获取需要把java类型映射成kotlin类型的ClassName  如:java.lang.String 在kotlin中的类型为kotlin.String 如果是空则表示该类型无需进行映射
         */
        private fun Element.javaToKotlinType(): ClassName? {
            val className = JavaToKotlinClassMap.INSTANCE.mapJavaToKotlin(FqName(this.asType().asTypeName().toString()))?.asSingleFqName()?.asString()
            return if (className == null) {
                null
            } else {
                ClassName.bestGuess(className)
            }
        }
    

    在需要获取类型的地方这样调用即可:

    val className = element.javaToKotlinType() ?: element.asType().asTypeName()
    

    相关文章

      网友评论

        本文标题:使用kotlinpoet生成kotlin代码数据类型不正确的问题

        本文链接:https://www.haomeiwen.com/subject/ajdqqftx.html