日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java 泛型 引用_Java嵌套自引用泛型

發布時間:2024/10/5 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 泛型 引用_Java嵌套自引用泛型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我有一個類,它有一個自引用的泛型參數和一個屬于同一個超類的參數。靜態函數與類具有相同的邊界。

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,因為聲明中的第二個參數表示它擴展了條。

我知道這可能是一個壞主意,并產生了難以理解的代碼,但我真的想知道為什么這不能編譯。

可能與我的問題stackoverflow.com/questions/9937422/&hellip有關;

@判斷有點類似;但根據我從您的問題中收集到的信息,編譯失敗的是類層次結構,而我的類層次結構編譯失敗的是函數的參數約束。

簡短的答案是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,而不是通配符。那么函數將有, S_C extends Bar,其中一個函數仍然可以在bar上有返回s_c…的方法,但我現在可能完全偏離了目標(這里大約3點)。

作為foo的參數類型,Bar< S_T, S_C >有什么問題?關于foo中的S_T的唯一信息就是它無論如何都是Bar< S_T, S_C >。另外,這使得foo(理論上至少)更為普遍。

函數的通用參數是什么?你的意思是只定義s_t和s_c沒有任何界限,因為參數中的bar與bar類的界限不匹配嗎?

對,那沒什么幫助。我突然想到,如果你想調用foo( ( C )null ),你也不關心foo中Bar的第二個參數,這意味著為什么不只調用static > void foo( S_T t ) {}?

好吧,這是可行的,這取決于你想做什么,因為如果你有一個通配符而不是s_c,你就不能調用new Bar()。

對于泛型,我不是一個裂縫,但我認為問題在于您將foo()的類型聲明為

> void foo(S_T)

然后在兩個不同的上下文中調用它,這些上下文要求foo()使用不同的靜態類型。

在第一個上下文中,S_T具有T類型,在第二個上下文中,它具有C類型。但是,T和C被聲明為Bar和Bar,它們是靜態上不相容的類型。我想編譯器會在第一次調用中找出foo()的類型,然后正確地假定該類型在整個過程中必須保持不變,而事實并非如此。

切換兩個foo()調用的順序仍然會在C行中產生錯誤。

好的,嘗試在類聲明中更改c和t的順序,即do bar,t extends bar如果錯誤翻轉,則意味著類型綁定還取決于類聲明中類型的順序。但是在這兩種情況下,C和T都有不同的不兼容類型,并且不能將這兩種類型都傳遞到foo()中。

我嘗試了你建議的更改,但錯誤變為t,但我認為這僅僅是因為它重命名了參數,沒有改變任何意義。我嘗試了幾種不同的方法來重新排序參數,但錯誤仍然存在于具有通配符的參數上。另外,我認為盡管c和t彼此不兼容,但兩者都應該與靜態函數兼容,因為afaik的通用參數是基于它每次調用所得到的輸入。

總結

以上是生活随笔為你收集整理的java 泛型 引用_Java嵌套自引用泛型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。