我正在实现一个项目的访问者模式,并意识到我可以通过接受的默认实现来保存一些类型。
public interface Visitable {
default public void accept(Visitor v) {
v.visit(this);
}
}
但是,如果this
的静态类型解析为Visitable,则此实现将无效,因此在这种情况下this
的静态类型是什么?
答案 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