我有一个通用的界面,我似乎无法围绕制作一个通配符捕获助手,这让我疯狂。
我有一个界面:
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对象。
非常感谢任何帮助,我希望我很清楚。谢谢!
答案 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) ) {...}