接口函数需要一个类型参数 <out R>

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

我正在按照 tutorial 使用 spring boot 和 java 实现 JWT 身份验证。但就我而言,我想用 Kotlin 来做。

我能够生成 jwt 令牌,但在从 jwt 令牌提取声明时遇到问题。

在本教程中,有一个通用函数可以从令牌中提取声明。

public <T> T extractClaim(String token, Function<Claims, T> claimsResolver {
    final Claims claims = extractAllClaims(token);
    return claimResolver.apply(claims);
}

private Claims extractAllClaims(String token) {
    return Jwts.parser().setSigningKey(KEY).parseClaimsJws(token).getBody();
}

public String extractUsername(String token) {
    return extractClaim(token, Claims::getSubject);
}

我用 kotlin 写的如下。

fun <T> extractClaim(token: String, claimResolver: Function<Claims, T>): T {
    val claims = extractAllClaims(token)
    return claimResolver.apply(claims)
}

private fun extractAllClaims(token: String): Claims {
    return Jwts.parser().setSigningKey(key).parseClaimsJws(token).body
}

fun extractUsername(token: String): String {
    return extractClaim(token, Claims::getSubject)
}

我从 Function 中收到错误

接口 Function 需要一个类型参数

我还可以看到还有其他选项,例如 KFunctionKFunction1

我在 Kotlin 方面经验不多,有人可以帮助我解决这里的问题或提出更好的方法吗?

spring-boot kotlin generics jjwt
1个回答
3
投票

Kotlin 中的函数类型有点不同,试试这个:

fun <T> extractClaim(token: String, claimsResolver: (Claims) -> T): T {
    val claims: Claims = extractAllClaims(token)
    return claimsResolver(claims)
}
© www.soinside.com 2019 - 2024. All rights reserved.