代码之家  ›  专栏  ›  技术社区  ›  Elye

我们是否仍然需要类(或kclass)后,已经具体化?

  •  1
  • Elye  · 技术社区  · 7 年前

    reified ,我可以替换下面的函数

    private fun <T>createFragmentX(fragmentClass: Class<T>, fragmentArgs: Bundle?): Fragment {
        try {
            val fragment = fragmentClass.newInstance() as Fragment
            fragment.arguments = fragmentArgs
            return fragment
        } catch (exception: Exception) {
            throw RuntimeException(exception.message)
        }
    }
    

    用这个

    private inline fun <reified T>createFragmentZ(fragmentArgs: Bundle?): Fragment {
        try {
            val fragment = T::class.java.newInstance() as Fragment
            fragment.arguments = fragmentArgs
            return fragment
        } catch (exception: Exception) {
            throw RuntimeException(exception.message)
        }
    }
    

    在我看来, 神化 不再需要使用 Class KClass . 我说的对吗?

    还有其他用途吗 等级 K级 那是无法满足的 神化 除了想做纯反射工作?

    2 回复  |  直到 7 年前
        1
  •  3
  •   Willi Mentzel user670265    7 年前

    简短回答:

    在你的例子中,除了美学之外,它没有什么不同。

    长回答:

    如果你通过 T 作为 reified ,您可以检索 KClass 神化 类型参数 T 这样地

    val kClass = T::class
    

    在任何时候。然后,您就可以使用 K级 作为参数,这里没有区别。


    有些情况下你需要使用 K级 作为参数。这里有两个:

    1)没有内联

    当你不希望你的功能 inline ,因为使用 神化 类型仅适用于内联函数。

    2)默认值

    另一种情况是默认值:

    fun f(kClass: KClass<*> = Int::class) { /*...*/ }
    

    对于一个具体化的类型参数,您无法实现完全相同的结果。

    结论:

    在所有其他情况下,使用泛型类型参数,因为它使调用站点更加简洁,如图所示(这可能是个人偏好):

    inline fun <reified T> printType() {
        println(T::class.simpleName)
    }
    
    fun printType(kClass: KClass<*>) {
        println(kClass.simpleName)
    }
    

    呼叫站点

    printType<Int>() // better
    printType(Int::class)
    
        2
  •  2
  •   Alexey Romanov    7 年前

    你不需要把它当作 参数 这里,但是您的代码仍然使用 Class 就是这样 T::class.java 是。所以是的,有很多情况你需要 等级 你的就是其中之一。