在Java8默认接口中,“this”的静态类型是什么?
我正在为一个项目实现访问者模式,并意识到我可以通过以下默认的accept实现来保存一些输入在Java8默认接口中,“this”的静态类型是什么?,java,java-8,Java,Java 8,我正在为一个项目实现访问者模式,并意识到我可以通过以下默认的accept实现来保存一些输入 public interface Visitable { default public void accept(Visitor v) { v.visit(this); } } 但是,如果this的静态类型解析为可访问,则此实现将不起作用,那么在这种情况下this的静态类型是什么?因为在您的上下文中,this被用作参数类型,所以在编译和运行时调用将解析为访问者#访问(可访问
public interface Visitable {
default public void accept(Visitor v) {
v.visit(this);
}
}
但是,如果
this
的静态类型解析为可访问,则此实现将不起作用,那么在这种情况下this
的静态类型是什么?因为在您的上下文中,this
被用作参数类型,所以在编译和运行时调用将解析为访问者#访问(可访问)
。因此,在这种情况下,尝试创建默认方法不会带来任何好处
此可多态使用的唯一时间是将其用作接收器时:
public interface Foo
{
public default void bar()
{
this.bar(1);
}
public void bar(int i);
}
你可以通过实验得出这个结论:
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);
}
}
以上输出
我正在访问一个通用的访问表
您认为它应该是什么?您是否尝试过并看到了发生了什么?您对访问者的定义是什么?哈!如果它能工作,那不是很好吗:)我创建了一个小示例来测试它,它的类型确实是可访问的。我必须重写每个实现类中的accept
方法,以获得我想要的行为,即使每个类的实现都与默认值相同。我希望Java能将默认方法复制粘贴到每个实现类中,但事实并非如此,因为这意味着您不能在添加方法之前编译的子类中使用默认方法-这就是为什么首先添加默认方法的原因。@Clashsoft唯一可以多态使用它的时间是在将其用作接收器时:
,但即使这样,您也只能得到标准的动态分派对于Java,您不能引用任何未由对象
、当前接口或其任何超级接口定义的方法。因此,this
的编译类型始终是当前类,实际上它在其他任何地方都是如此。@en4bz仔细想想,visitor模式的全部要点是克服Java缺乏基于运行时参数类型的重载函数之间的调度。如果default
方法的行为与您所希望的一样,那么实际上就不需要访问者模式。