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

"lateinit var覆盖lateinit var"

郏扬
2023-03-14

假设我有一个这样的设置:

abstract class FooTest {

    open lateinit var softAssertions: SoftAssertions

    ... reusable auxiliary functions ...
}
@ExtendWith(SoftAssertionsExtension::class)
class BarTest: FooTest(){

    @InjectSoftAssertions
    override lateinit var softAssertions: SoftAssertions

    ... actual test cases ...
    
}

IntelliJ为BarTest中的softAssertions:

lateinit变量覆盖lateinit变量

伊伊伊..?来吧,你的观点是什么?

我最终意识到我的lateinit varFooTest中确实应该是一个抽象val,而不是-它消除了警告-但即便如此,我还是想知道…是否有关于lateinit var覆盖lateinit var的内容,我应该知道但不知道,IntelliJ想告诉我但没有?

共有2个答案

东方修谨
2023-03-14

基本上,它只是警告你,它认为这种覆盖可能不是故意的,因为它看不到任何有用的东西。通常,你不能覆盖变量,但是静态编程语言中的变量是属性(即它们有getter和setter)。所以从技术上讲,你正在覆盖getter/setter,但是既然你没有改变它们的实现,为什么要这样做呢?

在科特林,财产覆盖的一个好例子是:

abstract class FooTest {
    open val softAssertions: SoftAssertions
}

然后

@ExtendWith(SoftAssertionsExtension::class)
class BarTest: FooTest(){

@InjectSoftAssertions
override lateinit var softAssertions: SoftAssertions

... actual test cases ...
}

在这种情况下,您将通过var(同时具有getter和setter)覆盖val(只有getter)。

孟晨朗
2023-03-14

原因在增加检查的问题中描述:

A2 [您情况下的 BarTest] 实例将具有两个用于单个属性的字段,而来自 A1 [FooTest] 的字段实际上仍未使用,这似乎很可疑。

...

为什么我们认为可疑只是一个具有后期属性的案例?我在这里要说的是,任何具有支持字段的属性覆盖另一个具有支持字段的属性的情况都是可疑的。

一般来说,带有支持字段的属性可以有自定义的setters,所以在某些情况下覆盖它们是有意义的。相反,lateinit属性从来没有自定义设置器,因此重写它们会使被重写的属性后备字段始终不被使用。

这两个不同的支持字段也可能导致有趣的事情,例如当lateinit变量的“isInitialized”属性被另一个类重写为var时,它为false。

在重写属性具有注释的情况下添加一个异常可能是有意义的,就像您的情况一样。

 类似资料:
  • 问题内容: 我们很少有扩展基本类的类。我们注意到我们使用了“退出一些睡眠”方法,并且希望在发生睡眠时进行记录。有没有一种方法可以覆盖Thread.sleep方法,在其中我可以添加一些自定义逻辑(即记录),然后仅调用实际的Thread.sleep()?这样,我就不必更改在我的基类中使用Thread.sleep的所有位置。我也愿意接受其他选择。 问题答案: 您不能重写方法,因为它是本机方法,所以无法对

  • 我正在开发一个Spring集成/引导应用程序。我正在使用一个多文档(src/main/Resources/application.yml)来设置几个配置类的默认值(用@ConfigurationProperties注释)。pplicaiton.yml带有默认值,其中一些需要被覆盖,具体取决于环境。 我可以在目录中使用Java系统属性(-D...=...)、Spring“属性”(--...=...)

  • 问题内容: 我试图在php中覆盖我的位置,但是我仍然在php.ini文件中获得了2 mb的值。 问题答案: 通过进行设置时,这些设置不会有任何效果。 原因是PHP 在 执行脚本 之前 需要这些值。上载时,将在完成上载后执行目标脚本,因此PHP需要事先知道最大大小。 在,虚拟主机配置或文件中进行设置。一个典型的文件如下所示:

  • 问题内容: 我的Java应用程序引用了一个使用log4j日志记录的第三方jar文件。问题是该jar包含自己的log4j.properties文件,这会导致我的机器上的访问被拒绝的异常,但是我无法控制jar文件来更改其内容。 我尝试在应用程序的类路径中添加自己的log4j.properties文件,但似乎没有效果。如果我尝试使用PropertyConfigurator以编程方式导入自己的设置,则lo

  • 在上一章中,我们讨论了超类和子类。 如果一个类从其超类继承一个方法,那么只要它没有标记为final,就有可能覆盖该方法。 覆盖的好处是:能够定义特定于子类类型的行为,这意味着子类可以根据其需求实现父类方法。 在面向对象的术语中,覆盖意味着覆盖现有方法的功能。 例子 (Example) 我们来看一个例子。 class Animal { public void move() { Sy

  • 对于Spring Boot2.1,默认情况下禁用bean重写,这是一件好事。 然而,我确实有一些测试,其中我使用mockito用模拟实例替换bean。在默认设置下,使用这种配置的测试将由于bean重写而失败。 我发现唯一有效的方法是通过应用程序属性启用bean重写: 但是,我真的希望确保测试配置的bean定义设置最小,这一点将由spring在禁用重写的情况下指出。 我正在重写的bean是 在导入到

  • 问题内容: 有没有人有过重写JavaScript函数的经验? 哪些浏览器支持此功能? 哪些浏览器版本支持此功能? 覆盖该功能有哪些危险? 问题答案: 绝对是“受支持的”。这是您的网页,您可以使用它进行任何操作。 我已经这样做了,可以在不修改库的情况下而是通过潜入事件来跟踪分析事件。 使用代理模式: 如果需要,您也可以绕过对原始函数的调用(代理)

  • 问题内容: 我如何能够覆盖该方法,然后捕获并更改其参数? 我已经尝试过代理方法,但是它没有用,尽管删除了在调用时打开的重写: 问题答案: 您不是要修改继承的方法,而只是将方法添加到实际上从未使用过的方法。 我在facebook中尝试了此代码,因此能够捕获到请求: 所以是的,需要将open方法添加到(window.XMLHttpRequest.prototype)而不是(window.XMLHttp