如何处理子类覆盖父类的静态方法?


#1

现在有个需求,就是子类覆写父类的静态方法,如果在java中大概如同:

class Father {
    public static void main(String[] args) {
        System.out.println("I'm father!");
    }
}

class Son extends Father {

    public static void main(String[] args) {
        Father.main(new String[]{});
    }
}

没什么问题,子类覆盖了父类的静态方法,然后调用了父类中的静态方法。
接下来换作Kotlin:

internal open class Father1 {
    companion object {
        @JvmStatic
        fun main(args: Array<String>) {
            println("I'm father!")
        }
    }
}

internal object Son1 : Father1() {
    @JvmStatic
    fun main(args: Array<String>) {
        //Companion.main(arrayOf())
        Father1.main(arrayOf())
    }
}

也没问题,我用了自动转换功能,执行效果一样。但是。。。。如果我改成Son1类继承Father类(子类Kotlin编写,父类Java编写),那么问题来了:

internal object Son1 : Father() {
    @JvmStatic
    fun main(args: Array<String>) {
        //Companion.main(arrayOf())
        Father1.main(arrayOf())
    }
}

报这个错误!

Kotlin: Accidental override: The following declarations have the same JVM signature (main([Ljava/lang/String;)V):
    fun main(p0: Array<(out) String!>!): Unit defined in com.test.syf.Father
    fun main(args: Array<String>): Unit defined in com.test.syf.Son1


这个问题。。。。。没有头绪如何解决。事实上我是写processing的时候发现,我想沿用java式的入口编写方法,把main写在类里。我也在processing forum上发了topic:

Processing in Kotlin with static main function error

请大神指点,感谢!


#2

头一回发问题,代码块高亮有点问题,很抱歉,还有,原文“覆写”应该是“覆盖”,因为知道覆写是有问题的!


#3

静态方法根本就不存在什么继承和覆盖的问题,这种奇怪的写法还是避免吧


#4

是的,我也觉得,但是processing 框架就是这么写的,PApplet 类中有main 静态方法,然后再写个子类继承它,在子类中添加入口函数,也就是再搞个main静态方法,运行。。。在java中是没有问题的。


#5

这种情况,还是用 Java 包一下吧,Kotlin 当中是没有静态的概念的。另外,我帮你优化了一下代码排版,主要是文字和代码之间加几个换行。当然也可以用 ``` 包起来效果会更好,还会有高亮效果:

fun main() {
    val x = 1
}

写法如下:

```kotlin
fun main() {
    val x = 1
}
```

#6

感谢您的回复!明白了!

fun main() {
    println("Thank You !")
}

#7

没看懂上面的例子什么意思,我是这么写的

internal open class Test {
    open fun get(): Int {
        return 1
    }
}

private class Test2 {
    companion object : Test() {
        override fun get(): Int {
            return 2
        }
    }
}

fun main() {
    print("${Test2.get()}")
}

京ICP备16022265号-2 Kotlin China 2017 - 2018