静态导入Kotlin Companion方法?

TL:博士; 是否有可能在另一个类的伴侣对象内import一个方法, 而不用 Companion限定导入? 也就是说,是否有任何可能的方式,我可以说import Bar.toFoo而不是import Bar.Companion.toFoo ,假设toFooBar的伴侣对象的方法?


我们正在从Java迁移到Kotlin。 我们的班级看起来像这样:

 class Bar { static Foo toFoo() { return new Foo(); } } 

然后,从一个碰巧是Kotlin的课程中使用它,我们会这样说:

 import Bar.toFoo; // ... Bar().convert(toFoo()); // like a Java 8 Collector // ... 

当我们将Bar转换成Kotlin时,看起来像这样:

 class Bar { companion object { @JvmStatic fun toFoo() = Foo() } } 

但是,我们希望调用代码不加修改地工作

 import Bar.toFoo 

不再有效,即使使用@JvmStatic! 相反,我们必须更新它

 import Bar.Companion.toFoo 

我们宁愿不必这样做 – 我们希望将Bar类切换到Kotlin而不更新调用者。

思考? 我们正在使用Kotlin 1.1.2-2。

与Java不同的是,Kotlin不允许你通过实例引用来调用静态成员。 Java根据编译时声明调度这些成员,所以在

 class Bar { static Foo toFoo() { return new Foo(); } } class Foo extends Bar { static Foo toFoo() { return new Foo(); } } class Baz { void test() { Bar fooAsBar = new Foo(); Foo foo = fooAsBar.toFoo(); } } 

在Java中, fooAsBar.toFoo()实际上会调用Bar.toFoo() (声明的类型),而不是Foo.toFoo() (运行时类型)。 这是一个误解和不好的编程实践的根源,所以Kotlin不支持它。

但是,您可以在Bar上定义扩展功能:

 fun Bar?.toFoo() = Bar.toFoo() 

那你可以打电话

 val foo = fooAsBar.toFoo()