【问题标题】:Why to use 'inline' when using a 'reified' type为什么在使用 'reified' 类型时使用 'inline'
【发布时间】:2021-12-15 00:28:07
【问题描述】:

我读过的所有关于类型具体化的教程都说我们在使用“具体化”时需要使用“内联”,但没有一个解释为什么。

假设我有一个函数:

inline fun <reified T> doSomething(value: T) {
    println("Doing something with type: ${T::class.simpleName}")    
}

据我了解,使用 'reified' 可以防止类型擦除。那么为什么我们不能在普通的非内联函数中使用它。使用 inlined 将使编译器在调用站点复制上述函数的主体。但是为什么我们需要这样做呢?

【问题讨论】:

    标签: kotlin generics inline type-erasure kotlin-reified-type-parameters


    【解决方案1】:

    具体化类型不是魔法——类型擦除仍然照常发生。那么具体化类型是如何工作的呢?好吧,假设我打电话:

    doSomething("Foo")
    

    编译器计算出TString。并且它可以直接把上面这行翻译成:

    println("Doing something with type: ${String::class.simpleName}")
    

    因此,从表面上看,类型似乎是具体化的,但实际上,类型只是内联的。这也是函数需要inline 的原因。如果不是inline,编译器无法内联类型参数。

    【讨论】:

    • 所以基本上,如果我们使用'inline'而不使用具体类型,所有内容都将被内联但类型不会,如果我们将'inline'与具体类型一起使用,所有内容都将与类型一起内联.我理解正确吗?
    • @SparshDutta 是的,你理解正确。
    • @SparshDutta 另外,如果您想知道为什么类型参数不会自动为所有内联函数具体化,请注意必须在调用站点知道具体化类型。例如,MyClass&lt;T&gt; 可以调用inline fun &lt;T2&gt;,将T 传递为T2,但是,如果T2 将被具体化,则同样是不可能的,因为MyClass 不知道它的T。因此,具有具体参数的内联函数有点“难以”调用。
    猜你喜欢
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 2022-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多