请问, kotlin 中与 Java 的 class 名::属性等价的操作是什么呢?

2021-09-07 15:26:44 +08:00
 heavyrainn

小弟在学习使用 beetlsql,当使用 lambdaQuery 的时候会发生报错,代码如下:

val sqlManager = getSQLManager()
//初始化数据脚本,执行后,内存数据库将有一个 sys_user 表和模拟数据
DBInitHelper.executeSqlScript(sqlManager, "db/schema.sql")


val query = sqlManager.lambdaQuery(UserEntity::class.java)
val entities = query.andEq(UserEntity::departmentId, 1)
.andIsNotNull(UserEntity::name).select()
/*上述代码对应的 java 代码如下:
LambdaQuery<UserEntity> query = sqlManager.lambdaQuery(UserEntity.class);
List<UserEntity> entities = query.andEq(UserEntity::getDepartmentId,1)
  .andIsNotNull(UserEntity::getName).select();
*/

执行的时候会得到如下错误:

Exception in thread "main" java.lang.RuntimeException: java.lang.NoSuchMethodException: MainKt$sam$org_beetl_sql_core_query_LambdaQuery_Property$0.writeReplace()
	at org.beetl.sql.core.query.LambdaQuery.getFunctionName(LambdaQuery.java:269)
	at org.beetl.sql.core.query.LambdaQuery.andEq(LambdaQuery.java:46)
	at MainKt.main(main.kt:22)
	at MainKt.main(main.kt)
Caused by: java.lang.NoSuchMethodException: MainKt$sam$org_beetl_sql_core_query_LambdaQuery_Property$0.writeReplace()
	at java.lang.Class.getDeclaredMethod(Class.java:2130)
	at org.beetl.sql.core.query.LambdaQuery.getFunctionName(LambdaQuery.java:255)
	... 3 more

JDK 使用 1.8 版本。请教大家这里该如何改写呢,非常感谢

1670 次点击
所在节点    程序员
6 条回复
chendy
2021-09-07 15:42:31 +08:00
beetlsql 的这个机制应该是用 serializedlambda 实现的,但是目测 kotlin 的实现方式是匿名内部类,于是无解,换 java 写吧

参考这里: https://discuss.kotlinlang.org/t/how-to-create-a-serializedlambda/8502/4
cs419
2021-09-07 16:28:18 +08:00
没用过 beetlsql
用过 mybatis plus 的 lambda query
不兼容 kotlin

但是针对 kotlin 有另外的实现类
你可以给 beetlsql 提建议 让他们加个实现
Kimen
2021-09-07 17:22:49 +08:00
类名::属性就是调用类的静态方法,可以直接 UserEntity.Companion.getName()
aguesuka
2021-09-07 18:16:41 +08:00
@Kimen 估计没用, 从 java 的 Method References 是用的 SerializedLambda 的 hack. kotlin 的语法应该没法创建它的实例
iseki
2021-09-08 00:18:27 +08:00
Kotlin 需要库进行额外处理,你用的这个看上去不支持,建议翻翻文档,有些会针对 Kotlin 提供额外的扩展包
cylee
2021-09-08 18:29:11 +08:00
有移动端同学吗?头条商业化招 Android iOS : //https://www.v2ex.com/t/798022//

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/800412

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX