解决 Kotlin 中的意外覆盖错误
Resolving Accidental Override errors in Kotlin
我最近开始使用 Kotlin 并开始使用 Kotlin 的 Spring Boot pet 项目。
我正在尝试将自定义用户域对象集成到 Spring 安全性中,因此想要实现 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<out GrantedAuthority> = AuthorityUtils.createAuthorityList("USER")
override fun isEnabled(): Boolean = true
}
我收到以下错误:
意外覆盖:以下声明具有相同的 JVM
signature (getUsername()Ljava/lang/String;): public final fun (): Kotlin.String, public abstract fun getUsername(): Kotlin.String !
意外覆盖:以下声明具有相同的 JVM
签名 (getPassword()Ljava/lang/String;): public final fun (): Kotlin.String, public abstract fun getPassword(): Kotlin.String !
因为我的用户 class 已经有方法 getUsername(): Kotlin.String 也实现了方法 getUsername(): Kotlin.String! ?
除了在 属性 的 getter 和 setter 上使用 @JvmName 之外,我应该如何解决此类错误?
这里的问题是,从 Kotlin 的角度来看,属性 getter 不可能覆盖超类型的函数。要解决它,您可以通过使您的属性 private
并手动实现超类型所需的方法来阻止编译器生成 getters,例如:
data class User(
private val username: String = ""
...
): UserDetails {
override fun getUsername() = username
...
}
我最近开始使用 Kotlin 并开始使用 Kotlin 的 Spring Boot pet 项目。
我正在尝试将自定义用户域对象集成到 Spring 安全性中,因此想要实现 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<out GrantedAuthority> = AuthorityUtils.createAuthorityList("USER")
override fun isEnabled(): Boolean = true
}
我收到以下错误:
意外覆盖:以下声明具有相同的 JVM signature (getUsername()Ljava/lang/String;): public final fun
(): Kotlin.String, public abstract fun getUsername(): Kotlin.String ! 意外覆盖:以下声明具有相同的 JVM 签名 (getPassword()Ljava/lang/String;): public final fun
(): Kotlin.String, public abstract fun getPassword(): Kotlin.String !
因为我的用户 class 已经有方法 getUsername(): Kotlin.String 也实现了方法 getUsername(): Kotlin.String! ?
除了在 属性 的 getter 和 setter 上使用 @JvmName 之外,我应该如何解决此类错误?
这里的问题是,从 Kotlin 的角度来看,属性 getter 不可能覆盖超类型的函数。要解决它,您可以通过使您的属性 private
并手动实现超类型所需的方法来阻止编译器生成 getters,例如:
data class User(
private val username: String = ""
...
): UserDetails {
override fun getUsername() = username
...
}