baomidou / mybatis-plus

An powerful enhanced toolkit of MyBatis for simplify development
https://baomidou.com
Apache License 2.0
16.25k stars 4.29k forks source link

kotlin下使用对象当做别名去引用属性传入Compare的方法无法编译通过了 #6246

Open atardecer17 opened 2 months ago

atardecer17 commented 2 months ago

当前使用版本

com.baomidou mybatis-plus-spring-boot3-starter 3.5.6

当前环境信息 java17+kotlin1.9.20

描述bug现象

在3.5.3.1版本中, 我使用下面这种写法让每个service中的属性引用变得简洁, 并且他工作得很完美 ` companion object { /* 用一个对象相当于给类起别名, 缩短在用其字段时的code / private val C = SysPropsEo() }

fun query(): SysPropsEo {
    return ktQuery()
        .eq(C::baseKey, "1")
        .eq(C::cacheKey, "2")
        .one
}

` 但是升级到3.5.4以上版本之后, 编译时就开始报错

Argument type mismatch: actual type is 'kotlin.reflect.KMutableProperty0<kotlin.String?>', but 'kotlin.reflect.KProperty1<in org.my.model.entity.SysPropsEo!, *>!' was expected.

看起来是由于升级后调整了参数泛型所导致? 这个改动能否进行兼容性改造? 每个引用属性的地方去写完整的entity类名是真的很啰嗦

ps: 我也尝试过kotlin的typealias写法, 但是似乎每个kt文件中写一个同名的叫做C的private的typealias, 当数量多的时候编译时会出现引用到其他文件的情况, 同样导致无法编译

提供问题复现步骤 使用kotlin1.9.0以上版本以及mybatis-plus3.5.4以上版本上面代码将无法编译通过

提供完整堆栈日志(可选)

提供问题复现工程(可选) 请尽量提供复现工程,减少大家排错的时间.

beingEggache commented 2 months ago

要用var, 你看报错, 已经是KMutableProperty0了, 不是 KProperty了...可以对照源码看.

nieqiurong commented 1 month ago

这个已经变更过了.

atardecer17 commented 1 month ago

看了下源码, 是在KtQueryChainWrapper中奖原来的KProperty<>改成KProperty1<in T, >, 对传入类型范围进行收窄了

atardecer17 commented 1 month ago

要升级又只能用回之前的写完整类名的方式了, 写着有点难受了, 有没有大佬有其他解法

atardecer17 commented 1 month ago

感觉从语法层面找不到解法了...只能把几个wrapper类在项目里重写把KProperty1<in T, >全都改回KProperty<>