看板 PLT 關於我們 聯絡資訊
※ 引述《sbrhsieh (sbr)》之銘言: : 我現在還是不能理解,為何你會把上述的例子當作是語法上的瑕疵。 : 我舉幾個例子: : 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 嗎? : } 看你的描述, 覺得你沒有真的了解我們在說的那個差異. 上面這個狀況不應該 OK 是沒錯, 有趣的是它不 OK 的原因. 在 Java 的設計下, compile time error 是這種: interface A<T> { T get(); void set(T t); } void func(A<? extends Number> a) { Number n = a.get(); // compile time error, set(T) cannot safely bind to any type a.set(n); } 但以 Scala 的設計, compile time error 是這種: interface A<T> { T get(); void set(T t); } // compile time error, invariant type T cannot be covariant void func(A<? extends Number> a) { Number n = a.get(); a.set(n); } 這些跟 JVM 沒關係, 純粹是語言層面上的設計問題. 兩個結果都是不能 compile, 但仔細想想這兩個點微妙的差別吧, 乍看或許覺得這兩個錯誤訊息說的是同樣的東西, 但其實是很不一樣的原因造成的. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.136.90.247