java 板


LINE

※ 引述《jtorngl (DDFL)》之銘言: : 請問 Collection 不支援 covariance (還是該說泛型不支援 covariance) : 所以 summary 只能傳入 List<Number> 的物件 : 而不能傳入 List<Integer>、List<Double>, ... : public double summary(List<Number> nums) { 你只能傳 List<Number>,不能傳 List<Integer> 等… : 為了讓這段程式能達到類似 covariance 機制 : 所以會使用 wildcard : public double wildcardSummary(List<? extends Number> nums) { 你可以傳 List<Number>、List<Integer> 等… : 不過泛型使用 extends 一樣可以做到不是嗎 : private <E extends Number> double genericsSummary(List<E> nums) { 你必須先確定 E 真正的型態,而這個 E 只能是 Number 的子類,一旦 E 確認了 ,例如 Number,那麼你就只能傳 List<Number>… 是的,這也可以解決 List<? extends Number> 能解決的問題,不過語法意義上 是不同的,只不過兩者正好涵蓋了相同的問題。 因為正好能解決相同問題,就簡潔度來說, List<? extends Number> 會是我想 要的寫法,因為只要出現一次角括號… 另一方面,若是個 instance method,通常會以類別上的型態限定為主,例如: public class Test<E> { public E foo(List<? extends Number> nums) { return null; } } 會在方法前使用型態限定,通常是在 static method 時,例如: public class Test { public static <E extends Number> Some foo(E e) { return null; } } : 目前能想到的只有,wildcard 有 super 來達到 contravariance : 但是泛型只支援 extends 而沒有支援 super : 那如果沒有要 contravariance 的效果 : 有什麼情況是 wildcard 才能做到,而泛型還是不能編譯的? 不要從能不能編譯來看,很多情況其實都可以通過編譯,你要看你想解決什麼 ,以及可讀性哪個比較好。 : 目前看一些文章,在方法的參數,要限制參數型態邊界時 : 幾乎都是使用 List<? extends Number> : 好像比較少看到 <E extends Number> ... List<E> : 看了一下 JDK 的 List interface : boolean addAll(Collection<? extends E> c); : 是因為限制的參數型態都是動態,才只能用 wildcard 嗎? 不是,理由上面說過,你想看到更多 <E extends Number> 的應用,可以找找 有 static method 的類別,例如 Collections.. static <T extends Object & Comparable<? super T>> T maxCollection<? extends T> coll) static <T extends Comparable<? super T>> void sortList<T> list) : 以JDK 的 List 介面來說 : public interface List<E> extends Collection<E> : 有一個方法是 boolean containsAll(Collection<?> c); : : 如果是這樣定義的 : boolean containsAll(Collection<E> c); : : 那當我們建立 List<String> strs = Arrays.asList("1", "2"); : 那這個 strs 的 containsAll 方法,只能用來比較 String 集合了 : : 反之因為使用 ? 定義 : boolean containsAll(Collection<?> c); 這樣定義 : 所以 strs 還是可以用來比對各種型態的集合 這就是兩者應用上的差別之一…instance method 通常會以類別上宣告的型態來限定, 因為閱讀上比較簡單。 也可以進一步看看這邊的文件: https://openhome.cc/Gossip/JavaEssence/WildCard.html -- 良葛格學習筆記 http://openhome.cc --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 39.10.69.16 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/java/M.1598789899.A.696.html ※ 編輯: JustinHere (39.10.69.16 臺灣), 08/30/2020 20:24:35 ※ 編輯: JustinHere (39.10.69.16 臺灣), 08/30/2020 20:25:04
1F:推 qrtt1: 是良葛格! 08/30 21:42
2F:推 jtorngl: 感謝良葛格的說明,Java SE8 技術手冊有買,不過第18章沒 08/31 12:58
3F:→ jtorngl: 翻XD,學習筆記的靜態方法泛型倒是有看不懂的地方,就是 08/31 12:59
從 Java SE 9 技術手冊開始,我有把 Producer Extends,Producer Extends 的說明加 進去,這也是個理解的方向。
4F:→ jtorngl: BeanUtil.<Student>getBean(...) 的用法,在方法名稱前面 08/31 13:00
5F:→ jtorngl: 加上 <型別> 只是為了鍊呼叫,不加會編譯錯誤 08/31 13:00
因為單純做 method chain,沒有變數型態可以參數,就得明確指定泛型的型態: BeanUtil.<Student>getBean( data, "cc.openhome.Student").getName(); 若有變數型態可參考就不用,因為編譯器可以從變數的型態來推斷,例如文件中 就有個例子: Student student = BeanUtil.getBean(data, "cc.openhome.Student"); ※ 編輯: JustinHere (110.26.97.16 臺灣), 08/31/2020 17:42:52
6F:推 jtorngl: public static <T> T obtain(T t) { return t; } 08/31 18:25
7F:→ jtorngl: 我有試著練習一個泛型方法 08/31 18:25
8F:→ jtorngl: GenericMethod.staticObtain("abc").toUpperCase(); 08/31 18:26
9F:→ jtorngl: GenericMethod.<String>obtain("abc").toUpperCase(); 08/31 18:26
10F:→ jtorngl: 發現沒加 <String> 還是可以編譯和執行,所以有點搞不懂 08/31 18:27
因為你的 obtain 是: public static <T> T obtain(T t) { return t; } T 用在參數上,之後的呼叫中,"abc" 已經告訴編譯器,T 的型態是 String 了… 至於文件上的 static method 是: public static <T> T getBean(Map<String, Object> data, String clzName) 之後的呼叫中,沒有任何來源可以告訴編譯器,T 的型態是什麼,你就得主動提供…
11F:→ jtorngl: JDK java-11-openjdk-11.0.8.10-2.windows.redhat.x86_64 08/31 18:29
12F:→ jtorngl: 沒加<String> 不是打錯,是推文長度不夠,改名忘了改到 08/31 18:30
13F:推 jtorngl: 我練習是 staticObtain(),推文長度不足才改 obtain() 08/31 18:32
14F:推 tw11509: java 8之後大部分的情況就不用加了,編譯器會自己推斷出 08/31 20:08
15F:→ tw11509: 來 08/31 20:08
編譯時期型態推斷是一直在加強,不用一直糾結在這部份,必須得提供時就提供,只要 你不是不明就理地直接 cast 就行。 ※ 編輯: JustinHere (27.247.130.217 臺灣), 09/01/2020 07:53:47
16F:推 jtorngl: 感謝良葛格說明,原來是方法的參數沒有型態讓編譯知道 09/01 11:18
17F:→ jtorngl: static <T> T jsonToObj(String json, Class<T> clazz) 09/01 11:19
18F:→ jtorngl: 我使用的方法都會在方法參數帶<T>,所以不知道那種用法 09/01 11:19
19F:→ jtorngl: 這種型態推斷蠻強大的,但就和初學lambda一樣,對語法 09/01 11:21
20F:→ jtorngl: 不熟悉時,會覺得為什麼可以這樣啊?! 09/01 11:21







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BuyTogether站內搜尋

TOP