如何在 Kotlin 中获取 Class<java.lang.Long>?

Kir*_*ill 5 querydsl kotlin

编写一些 querydsl 代码。在Java中我会这样做:

@Test
void countTest() {
    NumberPath<Long> cnt = Expressions.numberPath(Long.class, "count");
    NumberPath<Long> typeId = Expressions.numberPath(Long.class, "type_id");

    List<Long> fetched = sql.select(typeId)
            .from(SQLExpressions.select(tGroup.typeId.as(typeId), tGroup.count().as(cnt))
                    .from(tGroup)
                    .groupBy(tGroup.typeId))
            .where(cnt.gt(100L)).fetch();
    System.out.println(fetched);
}
Run Code Online (Sandbox Code Playgroud)

请注意这Long.class一点Expressions.numberPath(Long.class, ...)

如果我创建一个.kt文件并复制粘贴上述 Java 代码,它将被 Intellij 转换为:

Expressions.numberPath(Long::class.java, ...)

所以我得到的 Kotlin 代码是:

val cnt = Expressions.numberPath(Long::class.java, "count")
val typeId = Expressions.numberPath(Long::class.java, "type_id")

val fetched = sql.select(typeId)
        .from(SQLExpressions.select(QTGroup.tGroup.typeId.`as`(typeId), QTGroup.tGroup.count().`as`(cnt))
                .from(QTGroup.tGroup)
                .groupBy(QTGroup.tGroup.typeId))
        .where(cnt.gt(100L)).fetch()
println(fetched)
Run Code Online (Sandbox Code Playgroud)

现在,当我运行代码时,我得到:

java.lang.IllegalArgumentException: Unsupported target type : long

    at com.querydsl.core.util.MathUtils.cast(MathUtils.java:86)
    at com.querydsl.core.types.dsl.NumberExpression.cast(NumberExpression.java:178)
    at com.querydsl.core.types.dsl.NumberExpression.gt(NumberExpression.java:337)
    at project.dao.QuerydslKotlinCountTest.countTest(QuerydslKotlinCountTest.kt:30)
Run Code Online (Sandbox Code Playgroud)

所以这不是Class<java.lang.Long>我所期望的,而是一些类Class<long>(以前从未见过这个,并且无法通过编程方式获取它Class.forName("long"))。

那么,如何让这段简单的代码在 Kotlin 中运行呢?如果我替换Long::class.javajava.lang.Long::class.java,代码将无法编译:

Error:(27, 104) Kotlin: None of the following functions can be called with the arguments supplied: 
public open fun `as`(p0: Path<Long!>!): NumberExpression<Long!>! defined in com.querydsl.core.types.dsl.NumberExpression
public open fun `as`(p0: String!): NumberExpression<Long!>! defined in com.querydsl.core.types.dsl.NumberExpression
Run Code Online (Sandbox Code Playgroud)

我让它工作的唯一方法是使用盒装的java原语:java.lang.Long.valueOf(1).javaClass,但它看起来很丑。

use*_*612 6

尝试使用KClass'sjavaObjectType属性代替java,例如:

1L::class.java // returns long
1L::class.javaObjectType // returns java.lang.Long
Run Code Online (Sandbox Code Playgroud)

从它的文档来看:

[...] 对于原始类型,它返回相应的包装类。