在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上进行。
- Android应用程序中的Kotlin编译器:连接拒绝主机:127.0.0.1
- RealmMigrationNeededException添加RealmList (Kotlin)
- Kotlin是否提供任何性能提升?
- java.lang.NoClassDefFoundError:kotlin / jvm / internal / Intrinsics
- 如何在Kotlin中使用Double Epsilon / Precision调用assertEquals?
- 如何在Kotlin Android中为数据类创建空构造函数
- groupValues只返回重复模式的最后一次出现
- 使用JPA + Kotlin收集映射错误
- 正则expression式模式Kotlin