请考虑以下代码:
class Test {
void accept(Consumer<Integer> c) {}
static void consumer(Integer i) {}
void foo() {
accept(this::consumer); // The method accept(Consumer<Integer>) in the type Test is not applicable for the arguments (this::consumer)
accept(Test::consumer); // Valid
}
}
Run Code Online (Sandbox Code Playgroud)
前几天我偶然以非静态方式调用静态方法时遇到了这个问题.我知道你不应该以非静态的方式调用静态方法,但我仍然想知道,为什么不能在这种情况下推断出类型呢?
当我谈论Go时,我正在谈论gc编译器实现.
据我所知,Go执行逃逸分析.Go代码中经常出现以下习语:
func NewFoo() *Foo
Run Code Online (Sandbox Code Playgroud)
转义分析会注意到Foo转义NewFoo并在堆上分配Foo.
这个函数也可以写成:
func NewFoo(f *Foo)
Run Code Online (Sandbox Code Playgroud)
并将被用作
var f Foo
NewFoo(&f)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,只要f不在其他地方转义,就可以在堆栈上分配f.
现在来看我的实际问题.
编译器是否可以优化每个foo() *Foo进程foo(f *Foo),甚至可能在多个级别进行优化,其中Foo在每个级别中返回?
如果不是,这种方法在哪种情况下会失败?
先感谢您.