在Kotlin应用程序中,我有几个实体(每个实体都有一个数据类),并且对于每个实体,我都有一个实现通用Service<T>
接口的服务对象。
我想创建一个服务工厂,该服务将根据参数为我返回适当的服务,该参数是我要为其提供服务的实体的类型。在Java中,我会将Class
对象传递给工厂,该对象可以从实体类的静态上下文中获得,例如。 Entity.class
,但我在Kotlin无法做到。如何创建一个工厂,该工厂将根据实体的类型为我生产对象?
答案 0 :(得分:1)
您正在寻找KClass
:
假设您有以下课程:
abstract class Parent(val name: String)
class ChildA : Parent("A")
class ChildB : Parent("B")
那么您的工厂可能看起来像这样:
fun <T : Any> factory(c: KClass<T>): T {
return c.createInstance()
}
fun main(args: Array<String>) {
val childA = factory(ChildA::class)
val childB = factory(ChildB::class)
println(childA.name) // A
println(childB.name) // B
}
但是有一种使用reified
的更好的方法:
inline fun <reified T : Any> factory(): T {
return T::class.createInstance()
}
然后您可以这样称呼它:
val childA = factory<ChildA>()
val childB = factory<ChildB>()
println(childA.name)
println(childB.name)
请注意,如果不使用reified
,我们将无法T::class