Kotlin-Java 互操作不能与可变参数一起使用

我想抽象出在 Android 中获取资源,所以我编写了一个ResourceProvider实际提供资源的类:


@Singleton

class 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. 当我想获取带参数的字符串时遇到问题,我创建了以下示例:


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 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: Text

I/fromWrapper: Text with parameter: [Ljava.lang.Object;@6d43f06

I/fromContext: Text with parameters: Text, Text

D/AndroidRuntime: Shutting down VM

E/AndroidRuntime: FATAL EXCEPTION: main

    Process: xxx.xxx.xxx, PID: 22963


正如您所看到的,直接在Context没有缺陷的作品上调用它,但是用我的包装器调用相同的方法会使其打印Object.toString(),并且在第二种情况下它会崩溃。


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


@NotNull

public 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;

}

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


慕田峪4524236
浏览 137回答 1
1回答

繁星淼淼

您需要使用扩展运算符(*)来调用context.getString,即您需要使用*formatArgs:@Singletonclass ResourceProvider @Inject constructor(private val context: Context) {&nbsp; fun getString(@StringRes id: Int): String {&nbsp; &nbsp; return context.getString(id)&nbsp; }&nbsp; fun getString(@StringRes id: Int, vararg formatArgs: Any): String {&nbsp; &nbsp; return context.getString(id, *formatArgs)&nbsp; }...}您可以在kotlin 参考中阅读有关可变数量参数 (varargs)的更多信息。如果您不这样做,则给定对象(在本例中为formatArgs-array)将被视为您要传递给 - 方法的单个对象,vararg因此将被包装到Object[] { formatArgs }.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java