java 泛型 引用_Java嵌套自引用泛型
我有一個類,它有一個自引用的泛型參數(shù)和一個屬于同一個超類的參數(shù)。靜態(tài)函數(shù)與類具有相同的邊界。
public class Bar, C extends Bar> {
Bar() {
foo((T) null);
foo((C) null);//compile error
}
static , S_C extends Bar> void foo(S_T t) {
}
}
這會產生以下錯誤。
Bound mismatch: The generic method foo(S_T) of type Baris not
applicable for the arguments (C). The inferred type C is not a valid
substitute for the bounded parameter >
號
我不明白為什么C不能傳入foo(),因為C是Bar,通配符是Bar,因為聲明中的第二個參數(shù)表示它擴展了條。
我知道這可能是一個壞主意,并產生了難以理解的代碼,但我真的想知道為什么這不能編譯。
可能與我的問題stackoverflow.com/questions/9937422/&hellip有關;
@判斷有點類似;但根據我從您的問題中收集到的信息,編譯失敗的是類層次結構,而我的類層次結構編譯失敗的是函數(shù)的參數(shù)約束。
簡短的答案是Java類型的推理實際上是相當蹩腳的。
在EDCOX1(10)的聲明中,Java沒有對通配符EDOCX1 9進行任何智能推理,以推斷它在邏輯上是由EDCOX1〔11〕限制的(也不意味著EDCOX1在該約束中的9個S本身是有界的,等等)。一旦你把EDOCX1,9本身,這就是所有的Java知道。盡管沒有任何東西阻止您在EDCOX1(10)中聲明通配符,即使這樣對Java也沒有幫助;Java不會假設兩個單獨的EDCOX1×9個s指的是同一類型,即使更深的分析暗示它們必須是相同類型的。換句話說,即使使用以下代碼,編譯錯誤仍然存在:
public class Bar, C extends Bar>>> {
Bar() {
foo((T) null);
foo((C) null);//compile error
}
static , S_C extends Bar>>> void foo(S_T t) {
}
}
號
是的,我開始懷疑Java無法檢測通配符邊界之間的連接。我開始嘗試提供一個類:Pie extends Bar,而不是通配符。那么函數(shù)將有, S_C extends Bar,其中一個函數(shù)仍然可以在bar上有返回s_c…的方法,但我現(xiàn)在可能完全偏離了目標(這里大約3點)。
作為foo的參數(shù)類型,Bar< S_T, S_C >有什么問題?關于foo中的S_T的唯一信息就是它無論如何都是Bar< S_T, S_C >。另外,這使得foo(理論上至少)更為普遍。
函數(shù)的通用參數(shù)是什么?你的意思是只定義s_t和s_c沒有任何界限,因為參數(shù)中的bar與bar類的界限不匹配嗎?
對,那沒什么幫助。我突然想到,如果你想調用foo( ( C )null ),你也不關心foo中Bar的第二個參數(shù),這意味著為什么不只調用static > void foo( S_T t ) {}?
好吧,這是可行的,這取決于你想做什么,因為如果你有一個通配符而不是s_c,你就不能調用new Bar()。
對于泛型,我不是一個裂縫,但我認為問題在于您將foo()的類型聲明為
> void foo(S_T)
然后在兩個不同的上下文中調用它,這些上下文要求foo()使用不同的靜態(tài)類型。
在第一個上下文中,S_T具有T類型,在第二個上下文中,它具有C類型。但是,T和C被聲明為Bar和Bar,它們是靜態(tài)上不相容的類型。我想編譯器會在第一次調用中找出foo()的類型,然后正確地假定該類型在整個過程中必須保持不變,而事實并非如此。
切換兩個foo()調用的順序仍然會在C行中產生錯誤。
好的,嘗試在類聲明中更改c和t的順序,即do bar,t extends bar如果錯誤翻轉,則意味著類型綁定還取決于類聲明中類型的順序。但是在這兩種情況下,C和T都有不同的不兼容類型,并且不能將這兩種類型都傳遞到foo()中。
我嘗試了你建議的更改,但錯誤變?yōu)閠,但我認為這僅僅是因為它重命名了參數(shù),沒有改變任何意義。我嘗試了幾種不同的方法來重新排序參數(shù),但錯誤仍然存在于具有通配符的參數(shù)上。另外,我認為盡管c和t彼此不兼容,但兩者都應該與靜態(tài)函數(shù)兼容,因為afaik的通用參數(shù)是基于它每次調用所得到的輸入。
總結
以上是生活随笔為你收集整理的java 泛型 引用_Java嵌套自引用泛型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java多线程基础视频_【No996】2
- 下一篇: java 静态块的作用域_java 学习