有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

不兼容类型java泛型问题

我真的无法理解这个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);

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

谢谢你的帮助


共 (2) 个答案

  1. # 1 楼答案

    foo2foo3RS类型参数不相关。如果要强制它们相同,请将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;
       }
    }
    
  2. # 2 楼答案

    那是因为在使用

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

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

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

    请注意,这种自动推断是必要的,因为每个方法的类型参数RS都是独立的。没有人保证它们在整个类中引用相同的类型。如果您希望它们在整个类中相同,请将类本身设置为泛型,而不是方法