CodeBlock выбрасывает IAE, потому что CassName не проходит, проверка TypeName - PullRequest
0 голосов
/ 13 июня 2019

Я попытался инициализировать свойство, хотя CodeBlock # генерирует исключение IllegalArgumentException в CodeBlock # argToType

Я посмотрел на основную причину ошибки, которая была в CodeBlock # argToType. Даже если o является ClassName (которое также является TypeName), оно не проходит проверку is TypeName -> o и выдает исключение IllegalArguementException.

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

Я ожидал, что CodeBlock будет построен правильно, но вместо этого он выдает IllegalArguementException

1 Ответ

1 голос
/ 13 июня 2019

Я воспроизвел вашу проблему и смог ее исправить; Я думаю, что ключевым вопросом является как передать 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 'значения с типом значений, чтобы соответствовать %T ожиданиям заполнителя.

Надеюсь, это поможет вам!

...