不兼容的类型 java 泛型问题

Incompatible Types java generics issue

我真的无法理解这个Incompatible types编译错误。

interface Request {}

interface Response {}

class Foo {

   <RQ extends Request, RS extends Response> RS foo(RQ rq) {
      // This doesn't compile: Incompatible types error
      return foo3(foo2(rq));

      /* This compiles fine */ 
      // RS rs = foo2(rq);
      // return foo3(rs);
   }

   <RS extends Response, RQ extends Request> RS foo2(RQ rq) {
      return null;
   }

   <RS extends Response> RS foo3(RS rs) {
      return rs;
   }

令我感到好奇的是,如果在方法 foo 中代码编译正常,我将其替换为:

return foo3(foo2(rq));

作者:

RS rs = foo2(rq);
return foo3(rs);

我肯定漏掉了什么,但我还是不明白为什么。

感谢您的帮助。

foo2的和foo3RS类型参数没有关系。如果你想强制它们相同,请将类型参数放在class级别。

class Foo <RQ extends Request, RS extends Response> {

   RS foo(RQ rq) {
      return foo3(foo2(rq));
   }

   RS foo2(RQ rq) {
      return null;
   }

   RS foo3(RS rs) {
      return rs;
   }
}

那是因为在使用

的情况下
RS rs = foo2(rq);
return foo3(rs);

编译器知道将哪个具体类型 (RS) 用于 foo2 的特化。你是在明确告诉它你想要哪种类型。

foo3(foo2(rq)); 的情况下,编译器无法推断出这一点。因此,由于 foo2,您只得到不太专业的类型 Response,它不适用于 foo3

请注意,此自动推导是必要的,因为类型参数 RS 对于每个方法都是 独立的 。没有人保证它们在整个 class 中指的是同一类型。如果您希望它们在整个 class 中相同,请使 class 本身通用,而不是方法。