[英]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
和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;
}
}
那是因為在使用的情況下
RS rs = foo2(rq);
return foo3(rs);
編譯器知道用於foo2
專業化的具體類型( RS
)。 您是在明確告訴您所需的類型。
對於foo3(foo2(rq));
編譯器無法推斷出這一點。 因此,由於foo2
結果只是獲得了不太專業的類型Response
,而foo3
則不起作用。
注意,這種自動推導是必要的,因為類型參數RS
對於每種方法都是獨立的。 沒有人可以保證在整個類中它們都引用相同的類型。 如果希望它們在整個類中都相同,則使類本身通用,而不是方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.