我有这样的 Kotlin 实体
value class EntityId(val id: Long) {}
以及一些服务的接口
interface Service() {
fun do(entityId: EntityId)
}
及其实施。
但是当我使用像这样的Java代码中的接口时
{
...
EntityId id = new EntityId(1L);
service.do(id) // service is interface here
}
我收到编译错误。但这是非常可以理解的行为,因为 Kotlin 编译器从源代码生成
fun do(entityId: Long)
。
好吧,让我们使用这样的东西service.do(1L)
。
还会出现另一个问题:
java: cannot find symbol
symbol: method do(long)
我猜这是因为接口在编译过程中实际上没有改变。我找到了一种方法 - 将
value class
替换为 data class
但我会有 value class
。
也许,对于这种情况是否存在一些解决方法?
您可以重载采用值类的函数。
科特林
@JvmInline
value class EntityId(val id: Long)
class Service {
@JvmName("processEntity")
fun process(entityId: EntityId) {
}
fun process(entityId: Long) {
process(EntityId(entityId))
}
}
然后你可以从 Java 中使用
Long
文字 调用它
service.process(42L);