我有一个返回复杂泛型类型(实现多个接口)的方法
protected abstract <BOB extends Stan & Jan<I>> BOB getStanAndJanItem();
这编译很好,我可以覆盖它并返回值。一旦我调用它,我就会遇到编译错误(它甚至不必分配给任何东西)。我认为这是有道理的,因为BOB只在方法中定义。
那么,我如何在班级定义鲍勃?
是的,我知道我可以分开调用并让它们返回相同的对象,或者引入一些额外的继承(我可能最终会这样做)但是它也可以这样做吗? / p>
收到错误:
绑定不匹配:类型MyAbstractClass<I>
的泛型方法getStanAndJanItem()不适用于arguments()。推断类型Stan不是有界参数<BOB extends Stan & Jan<I>>
答案 0 :(得分:0)
为了调用该方法,您需要传递一个与您的约束匹配的泛型类型参数 即使您的特定调用不需要它,您仍然需要传递类型参数。
因此,如果使用实现这两种类型的某个类或接口对其进行参数化,则只能调用该方法。
答案 1 :(得分:0)
真正的问题是缺乏对交叉型的支持。假设语言直接支持它,我们可以编写像A&B
等交集类型,你的例子就像
Stan&Jan<I> getStanAndJanItem()
void setStanAndJanItem(Stan&Jan<I> item)
Stan&Jan<I> result = getStanAndJanItem();
result.doStanStuff();
result.doJanStuff();
setStanAndJanItem(result);
如果没有这样的支持,我们就会陷入困境。您的通用声明可能是错误的:它意味着调用者决定BOB
类型,而您可能希望实现决定BOB
类型。实现可以返回实现Stan
和Jan<I>
的任何内容。目前,该要求无法表达。