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

Java Wildcard Capture with a Generic Interface

我有一个通用接口,我似乎无法全神贯注地为它制作一个通配符捕获助手,这让我抓狂。

我有一个接口:

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

它的实现是这样实例化的:

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

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

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

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

在 foo.B() returns 中键入 FooBar。

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

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

嗯,最简单的当然是为此在接口上添加一个方便的方法:

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) ) {...}