gpt4 book ai didi

kotlin - 静态导入 Kotlin Companion 方法?

转载 作者:IT老高 更新时间:2023-10-28 13:46:03 25 4
gpt4 key购买 nike

tl:博士;是否可以 import 另一个类的伴生对象内的方法,无需使用 Companion 限定导入?也就是说,假设 toFoo 是一种方法,我是否可以说 import Bar.toFoo 而不是 import Bar.Companion.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()

关于kotlin - 静态导入 Kotlin Companion 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44532601/

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