Java Generics:我如何分配一个使用多重继承的方法的返回值

时间:2011-11-07 21:26:53

标签: java generics inferred-type

我有一个返回复杂泛型类型(实现多个接口)的方法

protected abstract <BOB extends Stan & Jan<I>> BOB getStanAndJanItem();

这编译很好,我可以覆盖它并返回值。一旦我调用它,我就会遇到编译错误(它甚至不必分配给任何东西)。我认为这是有道理的,因为BOB只在方法中定义。

那么,我如何在班级定义鲍勃?

是的,我知道我可以分开调用并让它们返回相同的对象,或者引入一些额外的继承(我可能最终会这样做)但是它也可以这样做吗? / p>

收到错误:
  绑定不匹配:类型MyAbstractClass<I>的泛型方法getStanAndJanItem()不适用于arguments()。推断类型Stan不是有界参数<BOB extends Stan & Jan<I>>

的有效替代

2 个答案:

答案 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类型。实现可以返回实现StanJan<I>的任何内容。目前,该要求无法表达。