代码之家  ›  专栏  ›  技术社区  ›  Vincent F

Kotlin的jvmdefault-还需要声明方法吗?

  •  0
  • Vincent F  · 技术社区  · 7 年前

    我正在将我的spring boot 1.5+kotlin1.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(){
    
        }
    
    }
    

    我遗漏了什么吗?

    谢谢

    文森特

    1 回复  |  直到 7 年前
        1
  •  1
  •   yole    7 年前

    方法名与 java.lang.Object.finalize() . 如果选择其他方法名,则应修复该错误。