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

Kotlin:接口…没有构造函数

葛昕
2023-03-14

我正在将我的一些Java代码转换为Kotlin,我不太明白如何实例化Kotlin代码中定义的接口。作为一个例子,我有一个接口(用Java代码定义):

public interface MyInterface {
    void onLocationMeasured(Location location);
}

然后在我的Kotlin代码中,我进一步实例化了这个接口:

val myObj = new MyInterface { Log.d("...", "...") }

而且效果很好。然而,当我将MyInterface转换为Kotlin时:

interface MyInterface {
    fun onLocationMeasured(location: Location)
}

当我尝试实例化接口MyListener时,我得到了一条错误消息:接口没有构造函数-尽管在我看来除了语法之外没有什么变化。我是否误解了Kotlin中接口是如何工作的?

共有1个答案

邰棋
2023-03-14

您的Java代码依赖于SAM转换--用一个抽象方法将一个lambda自动转换为一个接口。在Kotlin中定义的接口目前不支持SAM转换。相反,您需要定义一个实现接口的匿名对象:

val obj = object : MyInterface {
    override fun onLocationMeasured(location: Location) { ... }
}
 类似资料:
  • 问题内容: 在Java中,如果有接口: 然后实现是: 所以我的意思是,如果用户想用构造函数声明实例: 那不可能吗? 问题答案: 那不可能吗? 那就对了。你永远做不到 之后你必须选择一个 类 实现了接口(*) ,如: 为什么? 您可以将接口视为类的属性。比喻是形容词,例如“红色”。例如,创建一个红色的球()或一辆红色的汽车()是很有意义的,但是仅创建“红色”()没有任何意义(“红色代表 什么 ?”)

  • 问题内容: 我知道不可能在接口中定义构造函数。但是我想知道为什么,因为我认为这可能非常有用。 因此,您可以确定为该接口的每种实现定义了类中的某些字段。 例如,考虑以下消息类: 如果为该类定义一个接口,以便我可以有更多实现消息接口的类,则只能定义send方法,而不能定义构造函数。那么,如何确保此类的每个实现都确实有一个接收者集?如果我使用类似的方法,则不能确定是否真的调用了该方法。在构造函数中,我可

  • 我从我正在使用的库中收到以下接口: 如何创建该类的实现?(我需要一个测试模拟)一个自然的实现,构造函数定义为:

  • 无论我用什么方法尝试,无论是主构造函数还是次构造函数,我都不知道如何在kotlin中声明一个带有超类和构造函数的新类。 这是我最想做的,但它给出了一个错误,期望成员声明。 这是我认为主要构造函数的外观,但它给出了相同的错误。在Internet上搜索没有帮助,我只能找到第二个示例。 那么,用一个超类和它的一个构造函数创建一个类的所有有效方法是什么呢?

  • 我正在开始使用Android。我想创建一个数据库。但是日志显示错误,我的服务没有空构造函数。我无法添加任何空构造函数。一定是我做错了什么。但是我找不到它。请帮帮我。 主要活动。java: 我的其他班级 活动清单。xml 日志

  • 问题内容: 我在一个Activity中有一个IntentService,当我尝试调用该服务时,它将引发此错误,我发现这很奇怪,因为如果我声明了空的构造函数。 错误: AndroidManifest.xml 活动: 问题答案: 你是一个内部阶级。如果要将其保留在内部,请将其更改为static: 您可能需要阅读不同类型的嵌套类。google的第一个链接:http : //docs.oracle.com