在此方法中找不到对返回的引用

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 类中找不到引用的方法

对类型“Assembly”的引用声称它在“System.Runtime”中定义,但在 Xamarin UWP 中找不到

如果在字符串返回方法中找不到字符串,则返回替代值

在 Angular 2 中找不到引用的文件

在项目或库中找不到清单中引用的类

在 WCF 的添加服务引用中找不到 net.tcp 端点?