如何调用接口的子类

时间:2017-11-13 10:09:24

标签: java interface dynamic-binding

这个问题困扰了我一段时间。

在像泽西岛这样的框架中,我们可以使用接口来为我们的程序添加一些功能。例如,要在RESt应用程序中添加请求过滤,我们可以实现ContainerRequestFilter,然后我们获得认证。

我的问题是框架/库如何知道我们有一个接口的子类?

根据我的理解,你不能实例化一个接口,只有它的子类如:

public interface Greeter{
    void sayHi();
}

public class SpanishGreeter implements Greeter{
    @override
    void sayHi(){
        System.out.println("Hola");
    }
}

public class Controller{
   public void main(String[] args){
       //We must know the name of subclass to instantiate?
       Greeter spanishG = new SpanishGreeter();
   }
}

3 个答案:

答案 0 :(得分:3)

您正在寻找的是类路径扫描

这不是一项微不足道的任务,它几乎就是名称所说的:你基本上需要扫描类路径并加载你找到的每个类(虽然典型的实现将允许你将搜索限制在某些包及其中只有子包,才能阻止真正疯狂的事情。)

Java语言中没有任何特殊技巧可以简化此任务。

好消息是你不需要从头开始编写它,因为像Spring这样的框架已经内置了它,或者如果你想要完全的低级控制,你可以使用像{{{}这样的专用库。 3}}

答案 1 :(得分:0)

我认为instanceof关键字有助于此。

System.out.println(spanishG instanceof Greeter);  // true

答案 2 :(得分:0)

由于多态性而发生这种情况。你提到的代码

Greeter spanishG = new SpanishGreeter();

有父母的参考(在你的情况下界面)。在运行时它检查天气有一个实现该方法的子类,如果是,则它调用子类行为。在您的类中,您在运行时使用子类进行实例化,JVM知道您已经提供了实现。