在 java 代码签名中使用带有值类的 kotlin 方法是一种常见的开发技巧。值类是 kotlin 中的一种特殊类型,它可以用于存储和传递数据,类似于 java 中的基本数据类型。通过在 java 代码中使用带有值类的 kotlin 方法,我们可以充分利用 kotlin 的语法糖和函数式编程特性,以简洁和优雅的方式处理数据。在本文中,我们将介绍如何在 java 代码中使用带有值类的 kotlin 方法,并探讨其优势和注意事项。无论你是 java 开发者还是 kotlin 爱好者,本文都将为你带来有价值的知识和技巧。
问题内容
我有这样的 kotlin 实体
value class entityid(val id: long) {}
以及一些服务的接口
interface service() {
fun do(entityid: entityid)
}
及其实现。
但是当我使用来自 java 代码的接口时,如下所示
立即学习“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。
基于ECSHOP2.7.2制作,模板使用的是早期的凡客模板。整站大气,清爽。适合综合,鞋子,服饰类商城使用。具体安装方法在程序包中有说明,在使用之前请看下。 大体方法:1.上传程序至网站根目录,访问:域名/diguo (用户名:admin 密码:123456)2.设置好数据库信息,然后恢复数据,数据目录在www.shopex5.com下.3.修改data目录下的config数据库配置文件。4.登陆
也许,对于这种情况是否存在一些解决方法?
解决方法
您可以使用采用 long 的函数重载采用 value 类 的函数,并在后台调用原始函数。注意 @jvmname 上的 value 类 重载,这样 java 只会看到 long 重载。
科特林
@jvminline
value class entityid(val id: long)
class service {
@jvmname("processentity")
fun process(entityid: entityid) {
}
fun process(entityid: long) {
process(entityid(entityid))
}
}
然后您可以使用 long 文字从 java 调用它:
service.process(42L);










