【发布时间】:2021-02-23 20:32:34
【问题描述】:
我不明白为什么以下代码有效: 山姆接口:
fun interface WebResponseHandler
{
fun onWebResponseFinished(jsonObject:JSONObject)
}
而实现看起来像:
val onWebResponseHandler: VolleyHandler.WebResponseHandler = VolleyHandler.WebResponseHandler()
{
fun onWebResponseFinished(jsonObject: JSONObject) {
Log.v("da", "dsa")
}
fun foo() {
it.getString("name")
}
}
foo 函数如何知道it 是什么?毕竟,foo 函数不是 VolleyHandler.WebResponseHandler 接口的一部分,它 仅在接口作为一种方法时才起作用。Function Foo 在没有任何参数的情况下被调用,那么为什么 it 的含义在那里?
此外,如果我在尝试实现接口时从接口声明中省略关键字 fun,则会出现另一个问题:
val onWebResponseHandler: VolleyHandler.WebResponseHandler = VolleyHandler.WebResponseHandler()
{
fun onWebResponseFinished(jsonObject: JSONObject) {
Log.v("da", "dsa")
}
fun foo() {
Log.v("something", "something")
}
}
我收到一个编译错误提示
接口 WebResponseHandler 没有构造函数
这两种情况有什么不同?如果我删除 () 我会收到很多不同的错误,例如:
函数声明必须有名字
我希望有人能弄清楚这里出了什么问题
【问题讨论】:
-
发生的事情非常微妙和奇怪,但是这些代码都没有按照您的想法进行。你需要实际上做你认为你正在做的事情是在
=符号之后写object ::= object : VolleyHandler.WebResponseHandler() { ... } -
@LouisWasserman,我可以使用它是一个 SAM 接口的事实吗?你对我在帖子中写的所有问题都有解释吗?似乎 Kotlin 无法解释所有的混乱情况
-
看来如果我使用 () 我必须在同一行打开 {。实在看不懂这是怎么回事
标签: java kotlin lambda interface implementation