首页 > 解决方案 > Kotlin 的 JvmDefault - 还需要声明方法吗?

问题描述

我正在将我的 Spring Boot 1.5 + Kotlin 1.2.41 项目构建到一个 jar 中。jar 中的一个接口具有@JvmDefault并且可以使用标志很好地编译(如果我删除标志,它会失败)。

现在,我正在尝试在另一个 java 项目中使用此接口,其中我将 Kotlin 项目定义为依赖项。

在一个实现类中,我不覆盖默认方法。Intellij 似乎没问题,因为它不会抱怨。但是,当我使用 Maven 编译时,我得到:

[ERROR] attempting to assign weaker access privileges; was public

如果我实现该方法(使用一些虚拟实现),那么它会编译......但它违背了默认接口的目的。

知道有什么问题吗?

从 java 项目中打开 Kotlin 接口代码时,我看到的反编译代码如下:

public interface CrawlerOutput {
    @kotlin.jvm.JvmDefault public open fun finalize(): kotlin.Unit { /* compiled code */ }

    public abstract fun output(analyzedRepository: com.myCompany.Repository): kotlin.Unit
}

我实现接口的java代码:

public class CsvOutput implements CrawlerOutput {

    @Override
    public void output(Repository repository) throws IOException {
        log.info("own output is receiving some data !");
    }

    /**
    * IF I REMOVE BELOW METHOD, MAVEN CAN'T COMPILE IT ANYMORE, 
    * COMPLAINING OF WEAKER ACCESS PRIVILEGE
    */      
    @Override
    public void finalize(){

    }

}

我错过了什么吗?

谢谢

文森特

标签: javakotlin

解决方案


您的方法名称与java.lang.Object.finalize(). 如果您选择不同的方法名称,则应修复该错误。


推荐阅读