Scala学习记录「2」

编译优化

Posted by Jie on March 19, 2017

看了以前自己代码,发现下面例子。好智能,不用协变都能满足需求。

情景

scala> class A
defined class A

scala> class B extends A
defined class B

scala> class C[T]
defined class C

scala> object C{def apply[T](t: T) = new C[T]}
defined object C

scala> def f(x: C[A]) = 1
f: (x: C[A])Int

cala> f(C(new B))
res15: Int = 1

scala> val x = C(new B)
x: C[B] = C@30ec211a

scala> f(x)
<console>:18: error: type mismatch;
 found   : C[B]
 required: C[A]
Note: B <: A, but class C is invariant in type T.
You may wish to define T as +T instead. (SLS 4.5)
       f(x)

写在一起,就能加入了下文信息自动把Array(new B)当成ArrayA

如果不写在一起,f(C(new B))那就需要写成

val b: A = new B

val cb: C[A] = C(b)

f(cb)

或者定义协变

scala> class C[+T]

scala> val x = C(new B)
x: C[B] = C@17550481

scala> f(x)
res0: Int = 1

编译

scala.this.Predef.println(f(scala.Array.apply[A](new B())((ClassTag.apply[A](classOf[TfIdf$$main$A]): scala.reflect.ClassTag[A]))))

在Array后面指定了A类型。