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
相关产品推荐
相关产品推荐

