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

Java Wildcard Capture with a Generic Interface

我有一个通用的接口,我似乎无法将我的头环绕起来,为它生成一个通配符捕获助手,这让我抓狂。

我有一个接口:

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

它的实现正被实例化为:

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

这两个不能更改,显然我不能直接访问fooimpl()。假设使用fooimpl(),接口接受并返回foobar,它扩展了bar。

在代码中使用"foo"时会出现编译问题,例如:

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

其中foo.b()返回foobar类型。

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

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


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

1
2
3
4
5
6
7
8
public interface Foo<T extends Bar> {
    boolean isA(T t);
    T B();

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

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

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

没有比这更重要的了。抓取助手的目的就是得到一个Foo,然后做我们需要的任何事情。

然后:

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