gpt4 book ai didi

java - 是否可以在 Kotlin 中覆盖静态方法?

转载 作者:行者123 更新时间:2023-12-02 13:01:43 24 4
gpt4 key购买 nike

你好想象我们有以下类(class)

Manager{
public static void doSth(){
// some logic
};
}

如何在 kotlin 中覆盖该方法?

我已经厌倦了使用
fun Manager.doSth(){}

但它应用于实例而不是静态类型。

这样做的目的是为了避免使用 PowerMockito

最佳答案

简答



“短”解释

您只能覆盖虚拟方法,也可以遮蔽/替换 Java 中的静态方法,但不能遮蔽 Kotlin 中的“静态”方法,因为使用子类限定符时静态方法将不可用。即使在使用扩展方法时,您也不能像 那样为静态或非静态执行此操作。成员函数将永远获胜 (见下面的例子)。您可以做的是对父对象进行子类化并添加一个新的伴生对象,该对象具有与父对象同名的方法,并从内部调用父方法。

完整说明

  • 静态方法不能被覆盖。它被称为隐藏时的阴影
    一种方法与另一种方法。
  • Kotlin 中没有静态方法,所以你可以做的是使用companion object其行为类似,您可以访问该方法
    的伴生对象,就好像它是一个只使用的 java 静态方法
    类名作为限定符,但您无法访问
    来自其子类的父类的伴生对象,如 Java。
  • 您不能在 Kotlin 中隐藏静态方法,因为使用子类限定符时静态方法已经不可用,但是您可以编写另一个伴随对象并添加具有相同名称的方法并调用
    来自那里的父方法,因为无法访问父方法
    带有子类名称限定符。
  • 你不能制作一个遮蔽伴生对象的扩展方法
    方法甚至覆盖成员方法。如果一个类有成员
    函数和一个扩展函数被定义为具有相同的
    接收器类型,同名,适用于给定的参数,
    成员(member)总是赢。
  • Companion object extension : 你可以写一个扩展方法来
    伴生对象,但如果该伴生对象的成员具有
    成员(member)将始终赢得相同的签名。

  • 例子
    open class A {
    fun foo() {
    println("A.foo()")
    }
    companion object {
    fun bar() {
    println("A.Companion.bar()")
    }
    }
    }

    class B: A()

    fun A.foo() {
    println("A.foo() extension")
    }

    fun A.Companion.bar() {
    println("A.Companion.bar() extension")
    }

    fun A.Companion.baz() {
    println("A.Companion.baz() extension")
    }

    fun main(args: Array<String>) {
    A().foo() // prints A.foo()
    A.bar() // prints A.Companion.bar()
    A.baz() // prints A.Companion.baz() extension
    B.bar() // COMPILE ERROR
    }

    关于java - 是否可以在 Kotlin 中覆盖静态方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51266313/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com