作者macbuntu (邀怪)
看板PLT
標題Re: [問題] Scala 的 Covariant/Contravariant/Inv …
時間Wed Mar 18 16:57:29 2009
※ 引述《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