考虑下面的代码:
package com.gmail.oksandum.test;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
}
public void foo() {
class LocalFoo {
LocalFoo(String in) {
//Some logic
}
}
List<String> ls = new ArrayList<>();
ls.stream().map(LocalFoo::new); //Line 21
}
}
我的IDE没有任何错误。也就是说,在我尝试构建和运行项目之前没有问题。但是当我这样做时,它会给我一个编译器错误,看起来像这样:
Error:(21, 24) java: incompatible types: cannot infer type-variable(s) R
(argument mismatch; invalid constructor reference
cannot access constructor LocalFoo(java.lang.String)
an enclosing instance of type com.gmail.oksandum.test.Test is not in scope)
鉴于错误信息,我想,如果foo()是静态方法,这种情况就不会发生。而且完全正确,只有当foo()是实例方法时才会发生这种情况。只有在实例方法中LocalFoo是本地类并且使用构造函数引用时才会发生(即从不是常规方法引用)。
更重要的是,如果我将第21行改为
ls.stream().map(str -> new LocalFoo(str));
编译器突然没有报错了。
简单概括一下,如果我在实例方法内声明一个局部类并尝试使用构造函数引用,编译器就会抱怨无法访问构造函数,这让我感到困惑。
如果有人能解释一下为什么会发生这种情况,将不胜感激。谢谢。
new
表达式时可以正常工作,但在使用方法引用时会失败。我猜这是因为 局部类不属于任何类 这个令人困惑的规则导致的。 - Holger