Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java8默认接口中,“this”的静态类型是什么?_Java_Java 8 - Fatal编程技术网

在Java8默认接口中,“this”的静态类型是什么?

在Java8默认接口中,“this”的静态类型是什么?,java,java-8,Java,Java 8,我正在为一个项目实现访问者模式,并意识到我可以通过以下默认的accept实现来保存一些输入 public interface Visitable { default public void accept(Visitor v) { v.visit(this); } } 但是,如果this的静态类型解析为可访问,则此实现将不起作用,那么在这种情况下this的静态类型是什么?因为在您的上下文中,this被用作参数类型,所以在编译和运行时调用将解析为访问者#访问(可访问

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

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
方法的行为与您所希望的一样,那么实际上就不需要访问者模式。