7

我有一个混合项目JavaKotlin课程,我想知道如何companion objects从我的Java课程中引用。

4

3 回答 3

8

Kotlin 中的伴生对象具有静态支持字段和方法,以便与 Java 互操作,因此如果您已正确注释它们(使用 @JvmStatic 和 @JvmField),您基本上可以将它们视为静态类。所以:

class C {
    companion object {
        @JvmStatic fun foo() {}
        fun bar() {}
    }
}

foo 可以像静态函数一样从 Java 访问。酒吧不能。

C.foo(); // works fine
C.bar(); // error: not a static method
C.Companion.foo(); // instance method remains
C.Companion.bar(); // the only way it works

你可以对字段做同样的事情,除了你使用 JvmField

class Key(val value: Int) {
    companion object {
        @JvmField val COMPARATOR: Comparator<Key> = compareBy<Key> { it.value }
    }
}

然后:

// Java
Key.COMPARATOR.compare(key1, key2);
// public static final field in Key class

您也可以使用 const。

// file: Example.kt

object Obj {
    const val CONST = 1
}

class C {
    companion object {
        const val VERSION = 9
    }
}

const val MAX = 239

在 Java 中:

int c = Obj.CONST;
int d = ExampleKt.MAX;
int v = C.VERSION;

有关详细信息,请参阅文档中的 Java 到 Kotlin 互操作(无论如何,示例都是从那里复制粘贴的)。

如果您想经常与 Java 进行互操作,我建议您了解(并使用)JvmStatic 和 JvmField 注释,因为它们对于平滑 Kotlin 到 Java 的交互非常重要。

于 2017-05-25T20:36:54.910 回答
2

好的!如果你有类似的东西:

class MyKotlinClass {

    companion object {
        val VAR_ONE = 1
        val VAR_TWO = 2
        val VAR_THREE = 3

        fun printOne() {
            println(VAR_ONE)
        }
    }
}

您可以通过这种方式访问​​ Java 类中的字段

public class MyJavaClass {

    private void myMethod(){
            MyKotlinClass.Companion.getVAR_ONE();

            //The same for methods
            MyKotlinClass.Companion.printOne();
    }
}
于 2017-05-25T20:17:37.090 回答
0

这是带有伴生对象的 Kotlin 类。

class A {
    companion object {
        @JvmStatic fun foo() {}
        fun bar() {}
    }
}

从 Java 调用 Kotlin 类的伴随对象:

A.foo();
A.Companion.foo();
A.Companion.bar();
于 2017-05-25T20:26:46.743 回答