作者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