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

时间:2015-09-16 19:10:04

标签: java java-8

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

public interface Visitable {
    default public void accept(Visitor v) {
        v.visit(this);
    }
}

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

2 个答案:

答案 0 :(得分:6)

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

可以多态使用this的唯一时间是将其用作接收器时:

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

    public void bar(int i);
}

答案 1 :(得分:4)

你可以通过实验来解决这个问题:

public interface Visitable {
    default public void accept(Visitor v) {
        v.visit(this);
    }
}

public class Vis1 implements Visitable {

}

public class Visitor {
    public void visit(Visitable v) {
        System.out.println("Am visiting a generic Visitable");
    }

    public void visit(Vis1 v) {
        System.out.println("Am visiting a Vis1");
    }
}

public class Main {
    public static void main(String[] args) {
        Visitor v = new Visitor();
        Vis1 v1 = new Vis1();
        v1.accept(v);
    }
}

以上输出Am visiting a generic Visitable