与方差相关的错误消息

Error message relating to variance

当尝试将 sortBy 的结果输入 RDD 时:

  val counts: org.apache.spark.rdd.RDD[(String, Int)] = file.flatMap(line => line.split(" "))
    .map(word => (word.trim.toLowerCase, 1))
    .reduceByKey(_ + _)   
val sorted : org.apache.spark.rdd.RDD[Any] = counts.sortBy(-_._2)

收到编译器错误:

type mismatch;  found   : org.apache.spark.rdd.RDD[(String, Int)]  required: org.apache.spark.rdd.RDD[Any] Note: (String, Int) <: Any, but class RDD is invariant in type T. You may wish to define T as +T instead. (SLS 4.5) Error occurred in an application involving default arguments.

class RDD is invariant in type T 是什么意思?

如果改用:

   val sorted : org.apache.spark.rdd.RDD[_] = counts.sortBy(-_._2)

那为什么编译成功了?

RDD是不变的。所以,即使 (String, Int)Any 的子类,RDD[(String, Int)] 也不是 RDD[Any] 的子类。所以你不能将它分配给 RDD[Any].

RDD[_] 表示我不关心 RDD[T] 中的 T 是什么。

因为 variance 在 Scala 中是一个很大的话题,我不能给你全貌。这里只简单介绍一下:

如果类型C是协变的(Scala中的C[+T]),则意味着如果A是B的子类,则C[A]是C[B]的子类。

如果类型C是逆变的(Scala中的C[-T]),则意味着如果A是B的子类,则C[B]是C[A]的子类。

如果类型 C 是不变的(Scala 中的 C[T]),如果 A != B,则 C[A] 和 C[B] 之间没有子类关系。

如果你想了解更多方差和_,我推荐Scala in Depth