小编sqr*_*pin的帖子

具有非静态访问静态成员的Java 8类型推断

请考虑以下代码:

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)

前几天我偶然以非静态方式调用静态方法时遇到了这个问题.我知道你不应该以非静态的方式调用静态方法,但我仍然想知道,为什么不能在这种情况下推断出类型呢?

java type-inference java-8 method-reference

8
推荐指数
1
解决办法
272
查看次数

优化堆分配

当我谈论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在每个级别中返回?

如果不是,这种方法在哪种情况下会失败?

先感谢您.

optimization go

-2
推荐指数
1
解决办法
130
查看次数