静态导入Kotlin Companion方法?
TL:博士; 是否有可能在另一个类的伴侣对象内import
一个方法, 而不用 Companion
限定导入? 也就是说,是否有任何可能的方式,我可以说import Bar.toFoo
而不是import Bar.Companion.toFoo
,假设toFoo
是Bar
的伴侣对象的方法?
我们正在从Java迁移到Kotlin。 我们的class级看起来像这样:
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()
(声明的types),而不是Foo.toFoo()
(运行时types)。 这是一个误解和不好的编程实践的根源,所以Kotlin不支持它。
但是,您可以在Bar上定义扩展function:
fun Bar?.toFoo() = Bar.toFoo()
那你可以打电话
val foo = fooAsBar.toFoo()