在此方法中找不到对返回的引用
Posted
技术标签:
【中文标题】在此方法中找不到对返回的引用【英文标题】:Unable to find a reference to the return in this method 【发布时间】:2019-03-14 10:48:41 【问题描述】:我正在查看这个repository 以获得类似redux 的android 实现。在file 中,我发现了一个方法实现如下:
@Override
public Dispatcher create(Store<AppState> store, Dispatcher
nextDispatcher)
return action ->
log("dispatching action: " + action);
nextDispatcher.dispatch(action);
log("new state: " + store.getState());
;
我无法理解这种方法的return
是如何工作的,因为没有引用action
??还想知道如何将此方法实现转换为 Kotlin,因为 Android Studio 的 Kotlin 转换器在这种情况下没有帮助。将不胜感激任何帮助。谢谢!
【问题讨论】:
与 Kotlin 相关:***.com/questions/42646016/… 您使用的是 Java 8 吗? 感谢@emandt,但它在 Java 中是如何工作的?从 Java 的 sn-p 开始。 是的@Zoe,使用 Java 8。 【参考方案1】:你所拥有的是 lambda。这是编写一些代码的缩写形式。当然,并非所有东西都有 lambda,但确实如此。在您的情况下,您创建了一个匹配Dispatcher
的匿名类。
借助 Java 8 语言功能(如果您不在 Android 上,则使用 Java 8 本身)支持使用一种方法(可选地注解 @FunctionalInterface)来使用 lambda 声明接口。 IE。这个:
Runnable x = new Runnable()
@Override public void run()
// Foo bar
;
等同于:
Runnable x = () ->
// Foo bar
;
这适用于所有单方法接口。它们可以注释为@FunctionalInterface,但这不是必需的。
Dispatcher 是其中之一,来自您发布的代码。语法非常基本:
() ->
// () means 0 args. It can contain arguments if necessary
return "return value if applicable";
带参数:
oneArg ->
//Method body
(arg1, arg2) ->
// MethodBody
如果您愿意,可以将具有返回类型的方法简化为单行:
() -> "some string return type"
与参数相同的模式;我不会再为此添加示例。与上述相同。
我在这个答案中使用了不同的括号。实际上有一些围绕它们的使用的“规则”。如果语法错误,编译器会报错,但一般来说:
一个参数不需要 () 围绕它。这里是可选的。 零或两个以上的参数需要它们。在 Kotlin 或 Java 中不需要显式类型声明;它是自动处理的。至于Java,如果接口声明了一个带有int参数的函数,则不需要int x
。
在 Kotlin 中有一些例外(我遇到过编译器抱怨它无法推断类型,只是手动设置类型使其再次编译),但并不多。
无论如何,action
这里是方法中定义的单个参数。你基本上是在做基于 lambda 的继承,所以你需要在方法中拥有它,但你不必使用它(取决于你的实现)。
在 Kotlin 中,接口的 lambda 略有不同。在 Java 中声明的接口可以在 Kotlin lambda 中使用:
override fun create(store: Store<AppState>, nextDispatcher: Dispatcher) /*: Dispatcher*/
= Dispatcher x -> //Arguments declared here
// add your actions here
但是,this bug 阻止了 Kotlin 声明的接口以这种方式声明。您需要使用 object : WhateverInterface
并添加正文。 (在 1.2.70 也遇到过,所以还没有修复)。
【讨论】:
【参考方案2】:基本上是Lambda。
匿名类的一个问题是,如果你的实现 匿名类很简单,比如一个接口包含 只有一种方法,那么匿名类的语法可能看起来 笨拙且不清楚。在这些情况下,您通常会尝试通过 功能作为另一个方法的参数,例如什么动作 当有人单击按钮时应采取。 Lambda 表达式 使您能够做到这一点,将功能视为方法参数,或者 代码作为数据。
Dispatcher 是一个类接口。一个类接口称为功能接口,从 java 8 开始,可以用 lambda 表示。所以你看到的是 Dispatchers dispatch 方法的一个实现。
【讨论】:
以上是关于在此方法中找不到对返回的引用的主要内容,如果未能解决你的问题,请参考以下文章
Android ant 构建:proguard 在 ViewConfigurationCompatFroyo 类中找不到引用的方法