簡體   English   中英

不兼容的類型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);

當然,我缺少什么,但我仍然不明白為什么。

謝謝您的幫助。

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;
   }
}

那是因為在使用的情況下

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

編譯器知道用於foo2專業化的具體類型( RS )。 您是在明確告訴您所需的類型。

對於foo3(foo2(rq)); 編譯器無法推斷出這一點。 因此,由於foo2結果只是獲得了不太專業的類型Response ,而foo3則不起作用。

注意,這種自動推導是必要的,因為類型參數RS對於每種方法都是獨立的。 沒有人可以保證在整個類中它們都引用相同的類型。 如果希望它們在整個類中都相同,則使類本身通用,而不是方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM