实现Java接口的Kotlin类为何触发默认方法异常而非调用重写方法?
问题
定义如下Java接口:
public interface Currency { default String getName() { throw new NotImplementedException("Implement it!"); } }
希望在Kotlin中实现该接口:
object Dollar : Currency { val name = "$" override fun getName() { return name } }
当通过Dollar()初始化Dollar类并调用.getName()时,会抛出NotImplementedException异常。请问这是什么原因?难道无法将Java接口与Kotlin实现结合使用吗?
解答
问题出在你初始化Dollar的方式上——Dollar()是错误的调用方式。
在Kotlin中,object关键字定义的是单例对象,它不需要通过构造方法初始化,直接使用Dollar(对象名)来访问即可。当你用Dollar()调用时,并没有触发你重写的getName()方法,反而因为错误的调用逻辑,间接执行了Java接口的默认方法,导致抛出异常。
你的Kotlin实现本身是正确的,Java接口与Kotlin实现完全可以结合使用,只要遵循Kotlin的语法规范即可。正确的使用示例如下:
// 直接访问单例对象 val dollarInstance = Dollar println(dollarInstance.getName()) // 输出 "$"
内容的提问来源于stack exchange,提问作者Baterka
相关产品推荐
相关产品推荐

