Kotlin-Java互 *** 作不适用于varargs

Kotlin-Java互 *** 作不适用于varargs,第1张

概述我想抽象出在Android中获取资源的方法,因此编写了一个类ResourceProvider,该类实际上提供了资源:@SingletonclassResourceProvider@Injectconstructor(privatevalcontext:Context){fungetString(@StringResid:Int):String{returncontext.getString(id)}fun

我想抽象出在Android中获取资源的方法,因此编写了一个类ResourceProvIDer,该类实际上提供了资源:

@Singletonclass ResourceProvIDer @Inject constructor(private val context: Context) {fun getString(@StringRes ID: Int): String {    return context.getString(ID)}fun getString(@StringRes ID: Int, vararg formatArgs: Any): String {    return context.getString(ID, formatArgs)}...}

这里没什么特别的,只是在Context上调用方法.
当我想使用参数获取String时遇到问题,我创建了以下示例:

var fromContext = requireContext().getString(R.string.one_parameter_string, "Text")Log.i("fromContext", fromContext)var fromWrapper = resourceProvIDer.getString(R.string.one_parameter_string, "Text")Log.i("fromWrapper", fromWrapper)fromContext = requireContext().getString(R.string.two_parameter_string, "Text", "Text")Log.i("fromContext", fromContext)fromWrapper = resourceProvIDer.getString(R.string.two_parameter_string, "Text", "Text")Log.i("fromWrapper", fromWrapper)

以下是String资源:

<string formatted="false" name="two_parameter_string">Text with parameters: %s, %s</string><string formatted="false" name="one_parameter_string">Text with parameter: %s</string>

如您所见,我直接在Context和ResourceProvIDer类上调用了相同的方法.我希望得到相同的结果,但实际上这是控制台中打印的内容:

I/fromContext: Text with parameter: TextI/fromWrapper: Text with parameter: [Ljava.lang.Object;@6d43f06I/fromContext: Text with parameters: Text, TextD/AndroIDRuntime: Shutting down VME/AndroIDRuntime: FATAL EXCEPTION: main    Process: xxx.xxx.xxx, PID: 22963    java.util.MissingFormatArgumentException: Format specifIEr '%s'        at java.util.Formatter.format(Formatter.java:2522)        at java.util.Formatter.format(Formatter.java:2458)        at java.lang.String.format(String.java:2814)        at androID.content.res.Resources.getString(Resources.java:472)        at androID.content.Context.getString(Context.java:572)        at xxx.xxx.xxx.utils.ResourceProvIDer.getString(ResourceProvIDer.kt:21)        at xxx.xxx.xxx.vIEws.trial.TrialFragment.onVIEwCreated(TrialFragment.kt:45)        at androIDx.fragment.app.FragmentManagerImpl.movetoState(FragmentManager.java:1471)        at androIDx.fragment.app.FragmentManagerImpl.addAddedFragments(FragmentManager.java:2646)        at androIDx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2416)        at androIDx.fragment.app.FragmentManagerImpl.removeRedundantoperationsAndExecute(FragmentManager.java:2372)        at androIDx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)        at androIDx.fragment.app.FragmentManagerImpl.run(FragmentManager.java:733)        at androID.os.Handler.handleCallback(Handler.java:789)        at androID.os.Handler.dispatchMessage(Handler.java:98)        at androID.os.Looper.loop(Looper.java:164)        at androID.app.ActivityThread.main(ActivityThread.java:6944)        at java.lang.reflect.Method.invoke(Native Method)        at com.androID.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)        at com.androID.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

如您所见,直接在Context上调用它没有缺陷,但是使用我的包装器调用相同的方法使它打印Object.toString(),在第二种情况下崩溃.

这是getString(@StringRes ID:Int,vararg formatArgs:Any)方法的反编译版本:

@NotNullpublic final String getString(@StringRes int ID, @NotNull Object... formatArgs) {  Intrinsics.checkParameterIsNotNull(formatArgs, "formatArgs");  String var10000 = this.context.getString(ID, new Object[]{formatArgs});  Intrinsics.checkExpressionValueIsNotNull(var10000, "context.getString(ID, formatArgs)");  return var10000;}

有什么问题以及如何解决?

解决方法:

您需要使用传播运算符(*)来调用context.getString,即,您需要使用* formatArgs:

@Singletonclass ResourceProvIDer @Inject constructor(private val context: Context) {  fun getString(@StringRes ID: Int): String {    return context.getString(ID)  }  fun getString(@StringRes ID: Int, vararg formatArgs: Any): String {    return context.getString(ID, *formatArgs)  }...}

您可以在kotlin reference regarding variable number of arguments (varargs)中了解更多信息.

如果不这样做,则将给定对象(在本例中为formatArgs-array)视为要传递给vararg方法的单个对象,该对象因此将被包装到Object [] {formatArgs }.

总结

以上是内存溢出为你收集整理的Kotlin-Java互 *** 作不适用于varargs全部内容,希望文章能够帮你解决Kotlin-Java互 *** 作不适用于varargs所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1210154.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-04
下一篇2022-06-04

发表评论

登录后才能评论

评论列表(0条)

    保存