gpt4 book ai didi

java - 在 Java 中使用 Kotlin 值类

转载 作者:行者123 更新时间:2023-12-02 01:53:19 25 4
gpt4 key购买 nike

我们有两个项目,kotlin 项目发布了一个由 java 导入的包。

在kotlin中,是一个像这样的值类

@JvmInline
value class CountryId(private val id: UUID) {
override fun toString(): String = id.toString()
companion object { fun empty(): CountryId = CountryId(EMPTY_UUID) }
}

在java中,我们看不到构造函数,也看不到实际实例化这个类。我还尝试在 Kotlin 中创建一个工厂来创建它们

class IdentifierFactory 
{
companion object {
fun buildString(): String {
return "hello"
}

fun buildCountry(): CountryId {
return CountryId.empty()
}
}
}

在 java 中,我可以调用 IdentifierFactory.Companion.buildString(),它会起作用,但是 IdentifierFactory.Companion.buildCountry() 甚至不存在。

Java 的值类真的这么糟糕吗?

附言。我也尝试过使用@JvmStatic,但没有成功

页数。如果我从 java 端反编译 kotlin 字节码,并得到一个 CountryId.decompiled.java,这就是构造函数的样子

// $FF: synthetic method
private CountryId(UUID id) {
Intrinsics.checkNotNullParameter(id, "id");
super();
this.id = id;
}

pps。 Kotlin 1.5.21 和 Java 12

最佳答案

Is Java really this awful with Value classes?

值类是 Kotlin 的一项功能。它们基本上是允许更多类型安全(在 Kotlin 中!)的糖,同时通过拆箱内部值来减少分配。 CountryId 类存在于字节码中的事实主要是因为某些实例在某些情况下需要装箱(当用作泛型类型、父类(super class)型或可空类型时——简而言之,有点像原语)​​。但从技术上讲,它并不是真的要从 Java 方面使用。

In java, I can call IdentifierFactory.Companion.buildString() and it will work, but IdentifierFactory.Companion.buildCountry() doesn't even exist.

默认情况下,在其签名中具有值类的函数有意在 Java 中不可见,以避免 Java 中的重载出现奇怪的问题。这是通过 name mangling 完成的.您可以通过在 Kotlin 端的工厂函数上使用 @JvmName 注释来覆盖 Java 方法的名称,以使其在 Java 中可见:

@JvmName("buildCountryUUID") // prevents mangling due to value class
fun buildCountry(): CountryId {
return CountryId.empty()
}

然后它可以在 Java 端访问并返回一个 UUID(内联值):

UUID uuid = IdentifierFactory.Companion.buildCountryUUID();

ideally, I'd just like the constructor to work and not use the factory

我从评论中意识到您是在从 Java 创建实际的 CountryId 实例之后。使用 Java 中的 CountryId 构造函数对我来说效果很好:

CountryId country = new CountryId(UUID.randomUUID());

但我不确定这怎么可能,因为生成的构造函数在字节码中是私有(private)的...

关于java - 在 Java 中使用 Kotlin 值类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69920555/

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