使用通用接口的Java通配符捕获

时间:2016-03-23 23:59:21

标签: java generics interface wildcard

我有一个通用的界面,我似乎无法围绕制作一个通配符捕获助手,这让我疯狂。

我有一个界面:

public interface Foo<T extends Bar> {
  boolean isA(T t);
  T B();
}

并且它的实现正在实例化:

private Foo<? extends Bar> foo = new FooImpl();

这两个不能改变,显然我不能直接访问FooImpl()。假设使用FooImpl(),接口接受并返回FooBar,它扩展了Bar。

在我的代码中使用'foo'时出现了我的编译问题:

if ( foo.isA(foo.B()) ){ //whatever }

其中foo.B()返回类型FooBar。

我知道这是一个通配符捕获错误,需要一个帮助器,但我不知道如何设置一个。在类中没有实例化'foo'的方法,其中'foo'是一个参数,这是大多数助手似乎被编写的方式。 'foo'仅用于获取FooBar对象,并用于测试FooBar对象。

非常感谢任何帮助,我希望我很清楚。谢谢!

1 个答案:

答案 0 :(得分:1)

最简单的事情当然是在界面上添加一个方便的方法:

public interface Foo<T extends Bar> {
    boolean isA(T t);
    T B();

    default boolean bIsA() {
        return this.isA(this.B());
    }
}

无论如何,捕获方法只是一个带有类型参数的通用方法:

static <T extends Bar> boolean bIsA(Foo<T> foo) {
    return foo.isA(foo.B());
}

没有比这更多的东西了。捕获助手的目的只是获得Foo<T>并做我们需要的任何事情。

然后:

if ( Somewhere.bIsA(foo) ) {...}