当前位置: 首页 > 知识库问答 >
问题:

静态编程语言中lateinit属性的获取类

高吉星
2023-03-14

是否有可能在Kotlin lateinit属性初始化之前从其获取< code>::class.java?

从逻辑上讲,它应该可以工作——我试图获取一个类而不是一个值,但实际上它在未初始化的属性访问异常时失败。

请注意,我试图获取类的属性位于泛型类中,其类型是泛型参数之一:

abstract class MVIFragment<
        out INTERACTOR : MVIInteractor<UINTERFACE>,
        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)

对此有什么解决办法吗?

共有1个答案

裴楚青
2023-03-14

由于类型擦除,泛型类型在运行时是未知的。这就是Java/JVM的工作方式,Kotlin并不试图神奇地绕过它。(不像Scala,它有隐含的魔力,除了不工作的时候,它能神奇地工作。)

您必须从静态确定类型的上下文中传递它,例如

class Container<T : Any>(private val tClass: Class<T>) {
    val t: T = tClass.newInstance()
}

Container(String::class.java)

您可以使用具体化类型的内联函数来隐藏这种丑陋,

class Container<T : Any>(private val tClass: Class<T>) {
    val t: T = tClass.newInstance()

    companion object {
        inline operator fun <reified T : Any> invoke() = Container(T::class.java)
    }
}

Container<String>()

它真的编译成同样的东西。(

在您的情况下,不可能在基类(抽象)中执行此技巧;必须在混凝土类型上进行。

 类似资料:
  • 我想在spring boot中使用嵌套的ConfigurationProperties,它在java中工作,但在kotlin中不工作。我的应用程序属性中有以下行: 我创建了这个结构来处理这些属性: 我添加了 插件和依赖项到我的 当我运行这段代码时,我得到了一个异常:

  • 我试图用OkHttp和Cucumber在静态编程语言中设置一个Spring启动项目,并且在运行Cucumber任务时遇到以下错误。如何修复? 还有build gradle kts片段 我看到了这个错误https://github.com/square/okio/issues/647看起来可能是它,并修复了这个build.gradle,我如何将其翻译为kotlinbuild.gradle.kts?

  • 我想知道为什么在下面的代码中没有捕捉到异常: 函数的调用方式如下: 但我还是遇到了一个导致应用程序崩溃的异常: 我想说try/catch块会捕获异常,但唉。。。 什么原因导致异常没有被捕获?我想说线程并不重要,因为我使用try/get块来处理线程中的异常。 在Laalto的回答之后,我更新了代码,如下所示(对于那些感兴趣的人):

  • 如图所示,https://stackoverflow.com/a/16639438/8949356,在Java中,当声明的类是公共类时,可以重写其函数 但是我想知道如何用静态编程语言编写完全相同的代码,我已经尝试了很多,但没有找到任何关于这个主题的东西。我可以在Java中去做这件事,但我的其余代码是用静态编程语言编写的,而且我不能一直带着这种怀疑;静态编程语言对我来说是一个很好的工具,我想学习它。

  • 我正在尝试用Java编写下面用Kotlin编写的代码。我无法创建DefaultElementsAdapter,因为我无法获得正确的语法。 我无法获得正确的Java代码 Kotlin班是这样的 我正在尝试使用图书馆https://github.com/m7mdra/HtmlRecycler

  • 如何在 Kotlin 中制作 2D Int 数组?我正在尝试将此代码转换为 Kotlin: 这是我尝试过的一个尝试,第一个2D阵列不起作用,但我让1D阵列起作用了: