不兼容类型java泛型问题

不兼容类型java泛型问题,java,generics,incompatibletypeerror,Java,Generics,Incompatibletypeerror,我真的无法理解这个不兼容类型编译错误 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 compil

我真的无法理解这个
不兼容类型
编译错误

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;
   }
作者:

我肯定错过了什么,但我还是不明白为什么


谢谢您的帮助。

foo2
foo3
RS
类型参数不相关。如果要强制它们相同,请将type参数置于类级别

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;
   }
}
class-Foo{
RS foo(RQ RQ){
返回foo3(foo2(rq));
}
RS foo2(RQ RQ){
返回null;
}
卢比3(卢比){
返回rs;
}
}

这是因为在使用

RS rs = foo2(rq);
return foo3(rs);
编译器知道使用哪个具体类型(
RS
)专门化
foo2
。你是在告诉它你想要哪种类型

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


请注意,这种自动推断是必要的,因为类型参数
RS
对于每种方法都是独立的。没有人保证它们在整个类中引用相同的类型。如果你想让它们在整个类中都是一样的,那就让类本身成为泛型的,而不是方法。

谢谢你的叫醒电话谢谢你的回答,现在我明白了!
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);