Java 如何从接口类型的实现中获取接口不支持的特定方法';你不能提供吗?

Java 如何从接口类型的实现中获取接口不支持的特定方法';你不能提供吗?,java,Java,我使用一个公共接口,它不提供来自实现类的方法。我不想实例化具体的实现,但仍然需要使用这个方法 具体问题:如何使specialMethod()可用? 接口: public interface Filter { void commonMethod(); } 实施: public class IpFilter implements Filter { @Override public void commonMethod() { } public void sp

我使用一个公共接口,它不提供来自实现类的方法。我不想实例化具体的实现,但仍然需要使用这个方法

具体问题:如何使
specialMethod()
可用?

接口:

public interface Filter {
    void commonMethod();
}
实施:

public class IpFilter implements Filter {
    @Override
    public void commonMethod() {
    }

    public void specialMethod() {
    }
}
集装箱类别:

public class Manager {

    private final Filter filter = new IpFilter();

    public Filter getFilter() {
        return this.filter;
    }
}
调用方类:

public static void main(final String[] args) {
    final Manager manager = new Manager();
    manager.getFilter().commonMethod();
    manager.getFilter().specialMethod(); // METHOD NOT AVAILABLE
}
改变

specialMethod()不会显示,因为您试图在其上调用方法的对象是一个“筛选器”,并且筛选器没有定义specialMethod。只有IpFilter会更改。

更改

public class Manager {

    private final Filter filter = new IpFilter();

    public Filter getFilter() {
        return this.filter;
    }
}


specialMethod()不会显示,因为您试图在其上调用方法的对象是一个“筛选器”,并且筛选器没有定义specialMethod。只有IpFilter才有。

在您要调用
specialMethod()
的地方必须存在一个具体的类实例。如果您可以证明(即使用
instanceof
)它是正确的类,那么您可以向下转换到
IpFilter
,并调用该方法

public static void main(final String[] args) {
    final Manager manager = new Manager();
    Filter f = manager.getFilter();
    f.commonMethod(); 
    if (f instanceof IpFilter)
    {
        ((IpFilter) f).specialMethod();
    }
    ...
}
然而,这是代码气味,应该避免


然而,有时香肠制作并不美观,如果您必须在传统系统中工作,那么这是完成某些事情的唯一方法,而传统系统无法重新设计为没有那么多气味。

在您想要调用
specialMethod()
的地方必须存在一个具体的类实例。如果您可以证明(即使用
instanceof
)它是正确的类,那么您可以向下转换到
IpFilter
,并调用该方法

public static void main(final String[] args) {
    final Manager manager = new Manager();
    Filter f = manager.getFilter();
    f.commonMethod(); 
    if (f instanceof IpFilter)
    {
        ((IpFilter) f).specialMethod();
    }
    ...
}
然而,这是代码气味,应该避免


然而,有时香肠制作并不美观,如果您必须在一个无法重新设计为没有那么多气味的遗留系统中工作,那么这是完成某件事情的唯一方法。

当您有一个
过滤器时,为什么要调用一个只存在于
IpFilter
的方法?这是不可能的。当
specialMethod()
引用具体类中的实例变量时会发生什么情况?@OliverCharlesworth,因为
IpFilter
具有其他
Filter
实现所不具备的功能。泛型与此无关。在您想要调用
specialMethod()
的地方必须存在一个具体的类实例。如果您可以证明(即使用instanceof)它是正确的类,那么您可以向下转换到
IpFilter
并调用该方法。我已将此作为一个答案发布,并进行了解释。当您有
过滤器时,为什么要调用只存在于
IpFilter
的方法?这是不可能的。当
specialMethod()
引用具体类中的实例变量时会发生什么情况?@OliverCharlesworth,因为
IpFilter
具有其他
Filter
实现所不具备的功能。泛型与此无关。在您想要调用
specialMethod()
的地方必须存在一个具体的类实例。如果您可以证明(即使用instanceof)它是正确的类,那么您可以向下转换到
IpFilter
并调用该方法。我已将此作为答案发布,并给出了解释。