gpt4 book ai didi

scala - 与方差相关的错误消息

转载 作者:行者123 更新时间:2023-12-02 15:30:09 25 4
gpt4 key购买 nike

当尝试将 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 .

关于scala - 与方差相关的错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27892410/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com