在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上进行。