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()); } |
没有比这更重要的了。抓取助手的目的就是得到一个
然后:
1 | if ( Somewhere.bIsA(foo) ) {...} |