在 Java 代码签名中使用带有值类的 kotlin 方法

问题描述 投票:0回答:1

我有这样的 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

也许,对于这种情况是否存在一些解决方法?

java kotlin interface value-class
1个回答
0
投票

您可以重载采用值类的函数。

科特林

@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);
© www.soinside.com 2019 - 2024. All rights reserved.