你所要求的并不存在,你似乎在问:
我可以从超类的子类引用中引用它的伴生对象方法吗
or maybe you are asking:
Can I reference a static member of a superclass from a reference of its descendants.
The answer for both is no. It is by design of Kotlin that this is disallowed, was a conscious decision, was intentional. If you wish to change this decision you would need to file an issue in YouTrack. Programmers in Java were heavily confused by the inheritance and overriding of static methods and the behavior when called from one reference versus another and how it is statically resolved rather than dynamically. Java 8 team when adding static methods to interfaces realize the confusion this could cause so they took a more Kotlin approach of only allowing it to be called by the interface reference. To avoid these types of nightmares, the Kotlin team disallowed it. Just as they disallowed many other confusing aspects of Java.
其他答案(例如@voddan的答案)给你提供了一些变通方法,让你在使用companion objects时有同样的调用语法的感觉,但你在 comments 中拒绝了这些方法,说你想避开一个伴随对象,即使你的问题表明你正试图使用它们.所以假设你不想使用它们,答案就是no, can't be done.
To get rid of the companion object, you would want to talk about Can extension functions be called in a “static” way? ... which will be disappointing since it is not yet allowed.
回到companion objects(抱歉,这里它们是通往荣耀的唯一途径),您也可以手动将子对象的方法委托给父对象:
open class Parent {
companion object { // required, sorry, no way around it!
fun foo() = /* some cool logic here */
}
}
class Child: Parent() {
companion object { // required, sorry, no way around it!
fun foo() = Parent.foo()
}
}
或作为扩展:
open class Parent {
companion object {} // required, sorry, no way around it!
}
class Child: Parent() {
companion object {} // required, sorry, no way around it!
}
fun Parent.Companion.foo() = /* some cool logic here */
fun Child.Companion.foo() = Parent.foo()