如何使用接口作为另一个接口函数的参数?

时间:2016-01-26 11:51:23

标签: java oop interface

假设我有这两个接口......

public interface ObjectInterface { /* empty interface */ }

public interface ObjectHandler
{
    void handle(ObjectInterface object);
}

...还有一个实现ObjectInterface的具体类:

public class ConcreteObject implements ObjectInterface { /* ... */ }

为什么Java中不允许这样做?

public class ConcreteHandler implements ObjectHandler
{
    @Override
    public void handle(ConcreteObject object) // <-- ObjectInterface implementation
    {
        // ...
    }
}

ConcreteObject实现了ObjectInterface界面 但是,有没有办法用Java设计我的类来保持这种抽象模式?

3 个答案:

答案 0 :(得分:2)

接口方法是合同,

void handle(ObjectInterface object);

因此,接口的实现应遵守合同。所以它不会让你限制它接受的对象类型。

handle(ConcreteObject object){...}

以上限制了方法的输入,因为它只是ObjectInterface的一个实现。想想如果有另一个名为ConcreteObject2的实现实现了ObjectInterface,会发生什么。根据您的代码handle方法,我们不接受ConcreteObject2类型对象。 如果您想保留模式,可以使用java generics

答案 1 :(得分:2)

因为你违反了界面的合同,从而打破了Liskov替代原则。

接口说:handle()可以将ObjectInterface的任何实例作为参数。这是合同:handle()的任何实现都必须接受ObjectInterface的任何实例。

但是该类说:handle()只接受ConcreteHandler的实例。

答案 2 :(得分:2)

您可以使用已接受的ObjectHandler类:

参数化ObjectInterface
public interface ObjectHandler<T extends ObjectInterface> 
{
    void handle(T object);
}

并按如下方式使用:

public class ConcreteHandler implements ObjectHandler<ConcreteObject>
{
    @Override
    public void handle(ConcreteObject object) // <-- now this works
    {
        // ...
    }
}