繁体   English   中英

具有参数的Java接口作为另一个接口

[英]Java interface with parameters as another interface

我有一个类似的Java接口

    public interface Filter{
        public boolean acceptData(IFilterData data);
    }

    public interface IFilterData{

    }

为什么Java不允许我拥有如下的实现类?

public class SampleFilterImpl{
    public boolean acceptData(SampleFilterData data){ 
        return true;
    }
}

其中SampleFilterData implements IFilterData

我同意Filter接口指定的合同,对吗? 但是为什么不允许我这样做的逻辑是什么?

我同意Filter接口指定的合同,对吗?

不。

该接口允许调用者传递IFilterData 任何实现。

您的课程仅接受一种特定的实现。

假设你的意思

public class SampleFilterImpl implements Filter {

因为你可能有

Filter filter = (flag) ? new SampleFilterImpl() : new SomeOtherFilterImpl();
filter.acceptData(new SomeOtherFilterData()); // not SampleFilterData

如果flagtrue并且filter引用了SampleFilterImpl类型的对象,那么您将传递SomeOtherFilterData类型的参数,该参数与SampleFilterData的参数类型不匹配。

不,您同意“ Filter界面。 Filter接口指定您可以将任何 IFilterData赋予Filter实例,这意味着您应该能够执行以下操作:

public class SomeOtherFilterData implements IFilterData { ... }

new SampleFilterDataImpl().acceptData(new SomeOtherFilterData());

但是,您的acceptData仅允许传递SampleFilterData ,这违反了合同。

更一般而言, Liskov替换原则指出,您只能削弱接口的前提条件和/或加强接口的后置条件。 在Java中,这意味着您可以将子类用于重写方法的返回类型和引发的异常类型,也可以使用较少的异常类型。

一种解决方案是使您的Filter通用:

public interface Filter<T extends IFilterData> {
    public boolean acceptData(T data);
}

并让SampleFilterImpl实现Filter<SampleFilterData> 根据您的用例,您可能可以完全删除IFilterData并允许对任何T实施Filter

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM