Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 为什么“Intrinsics.checkParametersNotNull”不是内联的?_Kotlin_Inline_Kotlin Interop - Fatal编程技术网

Kotlin 为什么“Intrinsics.checkParametersNotNull”不是内联的?

Kotlin 为什么“Intrinsics.checkParametersNotNull”不是内联的?,kotlin,inline,kotlin-interop,Kotlin,Inline,Kotlin Interop,在Kotlin中,如果我们将一些Kotlin字节码反编译为Java,我们经常会看到这样一条语句,它执行空检查: Intrinsics.checkParameterIsNotNull(foo, "foo") 如果我们进一步探索,我们可以看到此方法的反编译实现,它的实现与它的名称完全相同: public static void checkParameterIsNotNull(Object value, String paramName) { if (value == null) {

在Kotlin中,如果我们将一些Kotlin字节码反编译为Java,我们经常会看到这样一条语句,它执行空检查:

Intrinsics.checkParameterIsNotNull(foo, "foo")
如果我们进一步探索,我们可以看到此方法的反编译实现,它的实现与它的名称完全相同:

public static void checkParameterIsNotNull(Object value, String paramName) {
    if (value == null) {
        throwParameterIsNullException(paramName);
    }
}
由于这个类(
Intrinsics
)的存在,我不能在没有stdlib的情况下使用Kotlin,即使我尽力避免使用stdlib中的函数,它也会自动生成对
Intrinsics.checkParametersNotnull
的调用

既然这个方法的实现很短(并且经常出现),为什么这个函数没有内联呢

是否有一些注释允许我们阻止Kotlin编译器生成此空检查?(可能类似于
@TrustedNotNull


对于ProGuard:我很担心,因为我正在研究共享库,在这种情况下ProGuard不适合我。我显然知道那些代码消除工具(ProGuard、dce js),我知道如何以及何时使用它们。

我只是问为什么函数不是内联的。

希望有人会出现,并给出一个更好、更正式的技术答案,但对于初学者来说,我认为避免(甚至试图避免)标准库通常不是正确的方法。它包含语言的基本结构,您可能应该在任何Kotlin代码库中使用这些结构。甚至连政府都说:

Kotlin标准图书馆为Kotlin的日常工作提供生活必需品


如果您担心它的大小,您可以使用特定于平台的工具来剥离它中您不使用的任何部分——例如,您可以将其用于Java,将其用于JavaScript。它的大部分内容不是相互依赖的,因此这些工具可以极大地减少最终输出将包含的标准库中的代码量。

我猜调用这个最终方法比内联它更有效


虽然代码看起来很简单,但它的字节码相当长。内联会影响效率

我很担心,因为我正在研究共享库,在这种情况下ProGuard不适合我。我显然知道那些代码消除工具,并且知道如何以及何时使用它们。我只想让这个人工制品越来越小。不管怎样,谢谢。不用猜了。实际上,您可以比较调用
intrinsic时的字节码大小。如果相应代码是内联的,则检查ParametersNotnull
与相应代码的字节码,并验证前者确实小得多。如果您的目标是减少jar大小,Proguard是您最好的朋友。您自己提供实现,这样就不需要kotlin stdlib了,怎么样?