CodeBlock 抛出 IAE 因为 CassName 没有通过是 TypeName 检查

CodeBlock throwing IAE because CassName does not pass is TypeName check

我尝试初始化 属性,尽管 CodeBlock#of 在 CodeBlock#argToType

中抛出 IllegalArgumentException

我调查了 CodeBlock#argToType 错误的根本原因。 即使 o 是一个类名(也是一个类型名),它也不会通过 is TypeName -> o 检查并抛出 IllegalArguementException。

val initString = "mutableMapOf(Pair(%T, %T), Pair(%T, %T))"
val initArgs = arraysOf(...)
CodeBlock.of(initString, initArgs)

我希望 CodeBlock 能够正确构建,但它抛出了 IllegalArguementException

我重现了你的问题并且能够修复它;我认为关键问题是 如何将 initArgs 传递给 CodeBlock.of:此方法需要第二个 varargs 参数,但您传递的是单个 Array<...> 值。

按如下方式更改代码似乎有效:

fun main(args: Array<String>) {
    val initString = "mutableMapOf(Pair(%T, %T), Pair(%T, %T))"
    val initArgs = arrayOf(String::class.java, String::class.java, String::class.java, String::class.java)
    val result = CodeBlock.of(initString, *initArgs)
    println("result is $result")
}

关键是传递*initArgs,而不是initArgs作为CodeBlock.of的第二个参数。

我明确初始化了 initArgs' 值 type 值,以匹配 %T 占位符期望。

希望对您有所帮助!