Java 8默认接口中`this`的静态类型是什么?

en4*_*4bz 9 java java-8

我正在实现一个项目的访问者模式,并意识到我可以通过接受的默认实现来保存一些输入.

public interface Visitable {
    default public void accept(Visitor v) {
        v.visit(this);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果静态类型this解析为Visitable,则此实现将不起作用,因此this在这种情况下静态类型是什么?

Cla*_*oft 6

因为在您的上下文中,this它被用作参数类型,所以调用将Visitor#visit(Visitable)在编译和运行时解析.因此,在此方案中尝试创建默认方法没有任何好处.

this使用它作为接收器时,唯一可以多态使用的时间:

public interface Foo
{
    public default void bar()
    {
         this.bar(1);
    }

    public void bar(int i);
}
Run Code Online (Sandbox Code Playgroud)

  • 实际情况并非如此,因为这意味着您无法在添加方法之前编译的子类中使用默认方法 - 这就是为什么首先添加默认方法的原因. (2认同)
  • @ en4bz当你考虑它时,访问者模式的重点是克服Java缺乏基于运行时类型参数的重载函数之间的调度.如果`default`方法表现得像你想要的那样,那实际上会使访问者模式变得不必要. (2认同)