作者sbrhsieh (sbr)
看板PLT
标题Re: [问题] Scala 的 Covariant/Contravariant/Inv …
时间Wed Mar 18 18:25:09 2009
※ 引述《macbuntu (邀怪)》之铭言:
: 看你的描述, 觉得你没有真的了解我们在说的那个差异.
: 上面这个状况不应该 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);
: }
: 两个结果都是不能 compile, 但仔细想想这两个点微妙的差别吧,
: 乍看或许觉得这两个错误讯息说的是同样的东西, 但其实是很不一样的原因造成的.
你的意思是不是即使是这样子,在 scala 设计中也应该是 compiler error(由
compiler 告诉 programmer invariant type 不能 covariant use)?
//
compile time error, invariant type T cannot be covariant
void func(
A<? extends Number> a) {
Number n = a.get();
}
我写了一个简单的 scala 程式:
object HelloWorld {
def main(args: Array[String]) {
var str_value:Value[String] = new Value[String]("Hello, World!");
var int_value:Value[Integer] = new Value[Integer](87);
showValue(str_value);
showValue(int_value);
}
// def showValue[V >: Any](obj:Value[V]) {
// println(obj.get);
// }
// def showValue(obj:Value[Any]) {
// println(obj.get);
// }
}
class Value[T](init:T) {
private var x:T = init
def get:T = { x }
def set(x:T) = { this.x = x}
}
我发现我没有办法写出一个 showValue method 可以让我单纯地把任一个 Value
instance 所持有的 value 输出,这是我欠缺某观念,所以我写不出来?还是?
这一点是我不满意 scala 关於 subtyping variance 语法的原因之一。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.173.129.21