Java 使用格式化参数包装call Context.getString会导致IllegalFormatConversionException

Java 使用格式化参数包装call Context.getString会导致IllegalFormatConversionException,java,android,string,kotlin,text-formatting,Java,Android,String,Kotlin,Text Formatting,我正在尝试为上下文#getString(id,args)方法创建包装器,因此我编写的代码更少: fun Context.string(@StringRes strId:Int,vararg fmtArgs:Any?)=getString(strId,fmtArgs) 调用函数时,会导致以下堆栈跟踪: 2020-04-17 13:26:20.778 24143-24143/mypackage E/ERROR: at com.android.internal.os.ZygoteInit.m

我正在尝试为
上下文#getString(id,args)
方法创建包装器,因此我编写的代码更少:

fun Context.string(@StringRes strId:Int,vararg fmtArgs:Any?)=getString(strId,fmtArgs)
调用函数时,会导致以下堆栈跟踪:

2020-04-17 13:26:20.778 24143-24143/mypackage E/ERROR:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Constructor.newInstance0(Native Method)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
        at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:267)
            ... 45 more
     Caused by: java.util.IllegalFormatConversionException: d != [Ljava.lang.Object;
        at java.util.Formatter$FormatSpecifier.failConversion(Formatter.java:4403)
        at java.util.Formatter$FormatSpecifier.printInteger(Formatter.java:2885)
        at java.util.Formatter$FormatSpecifier.print(Formatter.java:2839)
        at java.util.Formatter.format(Formatter.java:2524)
        at java.util.Formatter.format(Formatter.java:2459)
        at java.lang.String.format(String.java:2911)
        at android.content.res.Resources.getString(Resources.java:485)
        at android.content.Context.getString(Context.java:655)
        at mypackage.ktx.ContextKt.string(Context.kt:28)
看到这个问题,我查看了
kotlin.text
以了解它们如何使用参数执行字符串格式设置

/**
*将此字符串用作格式字符串,并返回通过替换指定参数获得的字符串,
*使用默认区域设置。
*/
@kotlin.internal.InlineOnly
public inline fun String.format(vararg args:Any?):String=java.lang.String.format(this,*args)
我适应了新的通话方式

fun Context.string(@StringRes strId:Int,vararg fmtArgs:Any?)=getString(strId,*fmtArgs)
…但是,它仍然使用相同的堆栈跟踪崩溃

我决定只获取字符串,然后使用JetBrains实现手动格式化它,看看是否有一些我没有想到的内部构件:

fun Context.string(@StringRes strId:Int,vararg fmtArgs:Any?)=getString(strId).format(fmtArgs)
我发现问题在于
%d
与对象不对应,但是如果Android能够在类似调用中使用这种工作和kotlin格式


这种情况下的解决方案是什么?

第一个和最后一个示例将数组作为第一个参数传递,因为
*
扩展运算符丢失,编译器可以使用它,因为
vararg fmtArgs:Any?
数组
,但也是
Any

getString(strId,*fmtArgs)
应该可以工作

我适应了新的通话方式

fun Context.string(@StringRes strId:Int,vararg fmtArgs:Any?)=getString(strId,*fmtArgs)


这很有效。内联和反内联后,gradle生成缓存刷新并开始工作。

是否尝试重写此方法,以便可以少写3个字符?我没有重写,我正在包装。是的,在DSL中写字符串(id)比写getString(id)对我来说不起作用要干净得多,你说的gradle build cache内联和反内联是什么意思?在尝试随机填充时,gradle build cache刷新了(我尝试的是生成一个内联函数,编译它,不再将其作为内联函数并重新编译)开始接受这种通话方式。我有一个个人库和两个完整的项目使用这个函数,所以你只需要让gradle服从你的命令:)!