当前位置: 首页 > 知识库问答 >
问题:

解决Kotlin中的意外覆盖错误

郜光明
2023-03-14

我最近开始和Kotlin一起学习,并开始了一个使用Kotlin的Spring靴宠物项目。

我试图将一个自定义用户域对象集成到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<out GrantedAuthority> = AuthorityUtils.createAuthorityList("USER")

    override fun isEnabled(): Boolean = true
}

>

  • 意外重写:以下声明具有相同的JVM签名(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!

    因为我的用户类已经有了一个方法getUsername():Kotlin.String,所以还要实现方法getUsername():Kotlin.String!?

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

  • 共有1个答案

    宗冠宇
    2023-03-14

    这里的问题是,从Kotlin的观点来看,属性getter不可能从超类型重写函数。要解决此问题,您可以通过使属性private并手动实现超类型中所需的方法来防止编译器生成getter,例如:

    data class User(
        private val username: String = ""
        ...
    ): UserDetails {
        override fun getUsername() = username
        ...
    }
    
     类似资料:
    • 我使用Jacoco进行单元测试代码覆盖。Jacoco生成的报告显示,在我的Kotlin代码中很少遗漏分支。我注意到,根据Jacoco的说法,协程代码和它之后的代码没有被适当地覆盖。我不确定这是因为协程还是其他原因。在用IntelliJ代码覆盖率运行我的单元测试时,我的Kotlin类显示了100%的覆盖率。 我不知道为什么Jacoco显示的覆盖率较低。我已经使用Spock(Groovy)编写了单元测

    • 当我打开XAMPP并点击启动MySQL按钮,它给我一个错误。我刚刚开始,但现在它不起作用。 下午12:19:12[mysql]正在尝试启动mysql应用程序 12:19:12 PM[mysql]检测到状态更改:正在运行 12:19:13 PM[mysql]检测到状态更改:已停止 12:19:13 PM[mysql]错误:mysql意外关闭 12:19:13 PM[mysql]这可能是由于端口被阻止

    • 我刚刚重新安装了XAMPP,当我尝试在XAMPP控制面板中启动Apache服务器时,现在出现以下错误: 我该怎么解决这个问题?

    • 我在将应用程序从Java镜像到Kotlin时遇到了一些问题。我用java编写了这个类,效果很好: 在IntelijiIdea中自动转换后,它开始变成这样 但编译器告诉我 意外重写:以下声明具有相同的JVM签名(to boolean(Ljava/lang/String;)Z): fun toBoolean(p0: String?):在my . util . booleanutils fun to B

    • 问题内容: 我目前正在练习使用Javascript / Dojo。但是,我有一个无法解决的错误: 未捕获的SyntaxError:意外令牌o 我已快速摘录了我的问题: 它专门针对以下方面: 我想知道为什么这是错误以及如何解决。 问题答案: 您正在尝试解析JavaScript对象。用于解析 表示 类似JavaScript的对象的JSON字符串。 只需完全跳过解析: 在相关说明中:您可能有兴趣阅读 “

    • 问题内容: 我在交互式python会话中将其用作变量名而意外覆盖了-有什么方法可以使我能够访问原始功能,而无需重新启动会话? (在那次会议上我有很多东西,我宁愿不必这样做,尽管当然可以,如果需要的话。) 问题答案: 只需删除掩盖内建函数的名称即可: 您仍然可以始终通过 模块访问原始的内置模块(在Python 2上,带下划线和no );如果您想覆盖内置函数,但又想从覆盖中遵从原始格式,请使用此命令: