0

假设我有这样的设置:

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 给了我一个非常有用的警告softAssertionsin BarTest

lateinit var 覆盖 lateinit var

耶耶耶耶 ..?继续,你的目的是什么?

我最终意识到我lateinit var的 inFooTest真的应该是一个abstract val, 相反 - 它摆脱了警告 - 但即便如此,我还是想知道......是否有关于lateinit var覆盖 alateinit var我应该知道但不知道并且 IntelliJ 想要告诉我,但不告诉我?

4

2 回答 2

2

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

A2[BarTest在您的情况下] 的实例将有两个字段用于单个属性,而A1[ FooTest] 中的一个仍然有效地未使用,这似乎很可疑。

...

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

具有支持字段的属性通常可以具有自定义设置器,因此在某些情况下覆盖它们可能是有意义的。相反,lateinit 属性从不具有自定义设置器,因此覆盖它们会使覆盖的属性支持字段始终未使用。

这两个不同的支持字段也可能导致有趣的事情,例如当一个 lateinit 变量的 'isInitialized' 属性被另一个类作为 var 覆盖时为假

添加一个异常可能是有意义的,其中覆盖属性具有与您的情况类似的注释。

于 2021-04-29T14:25:28.860 回答
0

基本上它只是警告你,它认为这个覆盖可能不是故意的,因为它没有看到任何有用的东西。通常,您不能覆盖变量,但 Kotlin 中的变量是属性(即它们具有 getter 和 setter)。所以从技术上讲,您正在覆盖 getter/setter,但是为什么您需要这样做,因为您没有更改它们的实现。

Kotlin 中属性覆盖的一个很好的例子是:

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)。

于 2021-04-28T17:34:26.163 回答