在Kotlin获得lateinit属性的类
在初始化之前,是否有可能从Kotlin的lateinit
属性获得::class.java
?
从逻辑上说,它应该工作 – 我试图获得一个类,而不是一个价值,但实际上它失败了未初始化的属性访问exception。
请注意,我试图获得类的属性是在generics类,其types是generics参数之一:
abstract class MVIFragment< out INTERACTOR : MVIInteractor, UINTERFACE : MVIUIInterface, MODEL : MVIViewModel > : Fragment(), MVIUIInterface, KodeinAware { lateinit var viewModel: MODEL
我需要这个类来创建一个ViewModel
的实例
viewModel = ViewModelProviders.of(this).get(viewModel::class.java)
当然我不能这样做:
viewModel = ViewModelProviders.of(this).get(MODEL::class.java)
任何解决方案?
由于types擦除,genericstypes在运行时是不知道的。 这就是Java / JVM的工作方式,Kotlin不会试图神奇地解决它。 (与Scala不同的是,这种隐含的魔法在神奇的情况下起作用,除非它没有)。
您将不得不从types静态确定的上下文中传递它,例如
class Container(private val tClass: Class ) { val t: T = tClass.newInstance() } Container(String::class.java)
您可以使用具体化types的内联函数来隐藏这个丑陋,
class Container(private val tClass: Class ) { val t: T = tClass.newInstance() companion object { inline operator fun invoke() = Container(T::class.java) } } Container()
这真的编译到同样的事情。 (如果types推断可以从上下文中确定,则可以省略
。)
就你而言,在基础(抽象)类中不可能做到这一点; 它必须在具体types上进行。