修改后是否仍然需要Class(或KClass)?

时间:2019-01-27 14:07:06

标签: kotlin

使用var express = require('express'); var router = express.Router(); var controllerdata2 = require('../controller/munculindata'); //--------------- var con = require('../koneksi').con; function munculindata(res) { con.query("select * from lat2", function (err, result) { if (err) { throw err; } else { res.render("index", { data: result }); } }); } /* GET home page. */ router.post('/login',controllerdata2.login); router.get('/', controllerdata2.list_data); router.get('/register',controllerdata2.register); router.get('/home',controllerdata2.home); router.get('/logout',function (req,res,next) { }); router.get('/delete/:id',function (req,res,next) { var id = req.params.id; con.query("delete from lat2 where id = "+id,function (err) { if(err) throw err; else munculindata(res) }); }); module.exports = router; ,我可以替换下面的函数

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) } } ,就不再需要使用reifiedClass。我对吗?

除了想要进行纯粹的反射工作之外,KClass还无法实现ClassKClass的其他用途吗?

2 个答案:

答案 0 :(得分:3)

简短答案:

在您的示例中,除了美观以外,其他没有任何作用。

长答案:

如果将T作为reified传递,则可以像这样从KClass类型参数reified中检索T

val kClass = T::class
随时

。然后,您拥有使用KClass作为参数的所有选项,因此这里没有区别。


在某些情况下,您需要使用KClass作为参数。这里有两个:

1)无内联

当您不希望函数为inline时,因为使用reified类型仅适用于内联函数。

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)

答案 1 :(得分:2)

您不需要在此处将其作为参数传递,但是您的代码仍使用Class:这就是T::class.java。因此,是的,在许多情况下,您需要Class,而您的情况就是其中之一。