解决Kotlin中的意外覆盖错误

我最近开始与Kotlin合并,并使用Kotlin开始了一个Spring Boot宠物项目。

我正在尝试将一个自定义的用户域对象集成到Spring Security中,因此需要实现UserDetails接口。

鉴于我的域用户对象如下:

import org.springframework.data.annotation.Id as DocumentId import org.springframework.data.mongodb.core.mapping.Document import org.springframework.security.core.GrantedAuthority import org.springframework.security.core.authority.AuthorityUtils import org.springframework.security.core.userdetails.UserDetails @Document data class User(@DocumentId val id: String? = null, val username: String = "", val password: String = "", val email: String = "", val name: String? = null, val surname: String? = null) : UserDetails { override fun isCredentialsNonExpired(): Boolean = true override fun isAccountNonExpired(): Boolean = true override fun isAccountNonLocked(): Boolean = true override fun getAuthorities(): MutableCollection = AuthorityUtils.createAuthorityList("USER") override fun isEnabled(): Boolean = true } 

我得到以下错误:

  1. 意外覆盖:以下声明具有相同的JVM签名(getUsername()Ljava / lang / String;):public final fun ():Kotlin.String,public abstract getUsername():Kotlin.String!

  2. 意外覆盖:以下声明具有相同的JVM签名(getPassword()Ljava / lang / String;):public final fun ():Kotlin.String,public abstract getPassword():Kotlin.String!

由于我的User类已经有一个方法getUsername():Kotlin.String也实现了方法getUsername():Kotlin.String! ?

除了在属性的getter和setter上使用@JvmName之外,我应该如何解决这样的错误?

这里的问题是,从Kotlin的观点来看,属性获取者不可能从超types中覆盖函数。 为了解决这个问题,你可以通过使你的属性保持private并手动实现超types所需的方法来防止编译器生成getter,例如:

 data class User( private val username: String = "" ... ): UserDetails { override fun getUsername() = username ... }