You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin使用方法引用将User转InstaUserDetails报Type mismatch错误如何解决

问题原因

你当前的InstaUserDetails仅提供了一个接收9个字段参数的构造函数,::InstaUserDetails方法引用对应的函数类型是「接收9个参数返回InstaUserDetails」,而Optional.map要求传入的函数类型是「接收1个User实例返回目标类型」,二者类型不匹配所以报错。

解决方案

方案1(推荐,支持方法引用)

给InstaUserDetails新增一个仅接收User实例的构造函数,在构造中直接调用父类构造传递字段:

// 加到InstaUserDetails.java中
public InstaUserDetails(User user) {
    super(
        user.getId(),
        user.getUserName(),
        user.getPassword(),
        user.getEmail(),
        user.getCreatedAt(),
        user.getUpdatedAt(),
        user.isActive(),
        user.getUserProfile(),
        user.getRole()
    );
}

新增后直接使用.map(::InstaUserDetails)即可正常编译运行。

方案2(无需修改InstaUserDetails代码)

不用方法引用,直接在lambda中手动取出User的所有字段传入原有构造:

// 替换原有.map(::InstaUserDetails)行
.map { user -> 
    InstaUserDetails(
        user.id,
        user.userName,
        user.password,
        user.email,
        user.createdAt,
        user.updatedAt,
        user.active,
        user.userProfile,
        user.role
    ) 
}
注意额外代码问题

你当前InstaUserDetails的接口实现存在死循环和逻辑错误,运行后会触发栈溢出或认证失败,需要修改如下:

@Override
public String getUsername() {
    // 不要硬编码返回字符串,调用父类的getUserName获取实际用户名
    return getUserName();
}

@Override
public boolean isAccountNonExpired() {
    // 不要调用自身,用业务字段判断,示例用active字段
    return isActive();
}

@Override
public boolean isAccountNonLocked() {
    return isActive();
}

@Override
public boolean isCredentialsNonExpired() {
    return isActive();
}

@Override
public boolean isEnabled() {
    return isActive();
}

内容的提问来源于stack exchange,提问作者Mama

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 01:15:01