首页 > 解决方案 > 澄清 lambda 中的 `this` 关键字

问题描述

interface Observable<T> {
    Subscription subscribe(Observer<T> observer);


    default Observable<T> filter(Predicate<T> fn) {
        return observer -> {
            Observer<T> obsT = new Observer<T>() {
                @Override
                public void onNext(T t) {
                    if (fn.test(t))
                        observer.onNext(t);
                }

                @Override
                public void onError(Throwable t) {
                    observer.onError(t);
                }

                @Override
                public void onComplete() {
                    observer.onComplete();
                }
            };
            return this.subscribe(obsT);
        };
    }
}

上面的代码中指的是什么this,有人可以帮忙吗...

标签: javareactive-programming

解决方案


该行为在JLS §15.27.2中定义:

与出现在匿名类声明中的代码不同,出现在 lambda 主体中的名称thissuper关键字的含义以及引用声明的可访问性与周围上下文中的相同(除了 lambda 参数引入了新名称)。

用简单的英语来说,这意味着this引用周围类型的当前实例。因此,在您的示例中,this引用Observable<T>.

这也意味着如果周围的方法是静态的,则不能使用this

import java.util.function.Supplier;

public class Sample {
  int x = 0;

  public static void main(String... args) {
    Supplier<String> function = () -> {
      return Integer.toString(this.x); // This is line 8
    };
  }
}

如果您尝试编译此代码,编译器将产生以下错误:

Sample.java:8: error: non-static variable this cannot be referenced from a static context
      return Integer.toString(this.x);
                              ^
1 error

Ideone demo


推荐阅读