PLT 板


LINE

看板 PLT  RSS
※ 引述《macbuntu (邀怪)》之銘言: : interface A<T> { : public T get(); : public void set(T t); : } : : static void func(A<? extends Number> a) { : Number n = a.get(); // OK : a.set(n); // compile time error : a.set(123); // compile time error : a.set(new Object()); // compile time error : a.set(null); // only this is OK : } : : 上面那個 func() 裡面, 如果沒有前三個 set() 呼叫, 是可以 compile 沒問題的. : 但是 T 用在 parameter type 的時候根本不該允許 <? extends Number> : 這種 covariant binding, 也就是說, Java compiler 允許 A 處在一個不正確 : 的狀態, 讓 A.set() 變成完全無用, 只能放 null 進去. 只允許 s.set(null) : 從語意上就變得說不通了, 原先的 A<T> 可以 a.set(a.get()) 為什麼 : 進到 func() 裡後不能 a.set(a.get())? 是因為 A 裡的 T 只該允許 invariant. 我現在還是不能理解,為何你會把上述的例子當作是語法上的瑕疵。 我舉幾個例子: static void func(A<? extends Number> a) { Number n = a.get(); a.set(n); // 應該要 OK 比較直覺 } 如果你把文脈考慮進來,會覺得會有編譯錯誤似乎不太對,但是如果你以編譯器的 觀點,或是 runtime bytecode 層面去看: static void func(A<? extends Number> a) { // 姑且不論值從哪裡來,VM 在 runtime 只知道 n 的 value 是 Number ref Number n = ...; // n could hold Integer, Double...etc ref value a.set(n); // 應該要 OK 嗎? } 如果你還是覺得變數的 n 的確切型別編譯器可以從 context deduce 出來,暫時把 例子想成: static void func(A<? extends Number> a, Number n) { a.set(n); } 當你看到 client code: func(new A<Float>()); // func(new A<Double>(), new Integer(87)); 編譯器不放行是對的。 ※ 引述《godfat (godfat 真常)》之銘言: : 我覺得到了這邊的話,可能就要回頭來看 variance annotation 原本 : 所表達出的語意,也就是 A[+T] 時表示如果 U < T, 則 A[U] < A[T] : 所以你能在 scala 裡做這件事,卻不能在 java 裡做: : : val int_list: List[Integer] = List(1,2,3) : val any_list: List[Any] = int_list : : 雖然 java array 是可以的,因此 java array 本身似乎帶有 +T 的意義? : 也就是說並不只是在 argument 上可以有 variance, value/variable 也是可以的。 formal parameter 本質上就是 local variable,所以在 Java 中也是可以這樣做: java.util.List<Integer> int_list = new java.util.ArrayList<Integer>(); java.util.List<? extends Object> any_list = int_list; 這時候可不能說:可是在 Java case 裡,any_list "卻" 沒有辦法放進任何東西。 因為 scala case 中,any_list 一樣不能放進任何東西,你說『scala 中的 List 本來就是設計成 immutable』,我會說『就因為 scala List 設計成 immutable 所以你才能有一個 List[+T],讓你在 scala 中能以比較短的寫法 List[Any] 作跟 Java List<? extends Object>(寫法比較長) 一樣多的事』。你能夠有 covariant subtyping 的 List[+T],是可遇不可求的。 那反過來,如果假設 scala List 當初也是設計成 mutable 容器(也就是 List[T]), 那麼我可以在 Java 裡這樣子使用 local variable: java.util.List<Integer> int_list = new java.util.ArrayList<Integer>(); java.util.List<? extends Object> any_list = int_list; System.out.println(any_list.get(0)); 請問,在 scala 中該怎麼作? ======================================================================== 一來一往到這一篇,我是覺得有點亂了,或許每個人想要交流的看法並沒有真的 有交流到。 Java Generics 最後採用的語法的確是不容易掌握(也就是不直覺),我認為會造成 這樣子的原因在於,當初 Java team 進行引入 generics 的一個主要原則: 令 JVM (spec) 必要的修改最小,不是令它的語法既簡單又美 以最後實現在 Java 1.5 中的 generics 來說,JVM 規格配合 generics 而作的 修改,真的是蠻小的。主要是增加 type parameter, type bounds 這些資訊 進 class/method bytecode,讓 compiler 可以讀取到,JVM 的 instruction 沒有 任何一個有修改。 最後,我認為每一個 Java programmer,沒有看過這兩個 paper(除非完全不用到 Java Generics)的人,都應該花時間看看: Adding Wildcards to the Java Programming Language http://www.jot.fm/issues/issue_2004_12/article5.pdf On Access Restriction with Java Wildcards http://www.jot.fm/issues/issue_2005_12/article6.pdf --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.173.129.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燈, 水草

請輸入看板名稱,例如:e-shopping站內搜尋

TOP