协方差和Scala集合

Pau*_*aul 1 scala list set covariance

我正试图了解Scala集合的协方差.我有以下内容:

abstract class MediaFormat{
    def name:String
    def status:String
}

case class H264_high(status:String="on") extends MediaFormat {
    def name = "h264_high"
}
case class H264_med(status:String="on") extends MediaFormat {
    def name = "h264_med"
}
case class H264_low(status:String="on") extends MediaFormat {
    def name = "h264_low"
}
case class H264_syndication(status:String="off") extends MediaFormat {
    def name = "h264_syndication"
}
Run Code Online (Sandbox Code Playgroud)

我想要做的是拥有一组所有这些格式,因为我需要一个集合,每个格式只出现一次,所以我试过:

object MediaFormat {
    val allFormats:Set[MediaFormat] = Set(H264_high,H264_low)
}
Run Code Online (Sandbox Code Playgroud)

这给了我一个编译时异常,因为正如我现在所理解的,Set是不变的.

所以我想,我想我只需要使用List并自己管理重复的值

但后来我试试这个:

object MediaFormat {
    val allFormats:List[MediaFormat] = List(H264_high,H264_low)
}
Run Code Online (Sandbox Code Playgroud)

因为据我了解,List 协变的,但仍然无法编译.

有人可以帮助我理解我应该做些什么来获取我的格式集合?

oxb*_*kes 7

它不会编译,因为您引用了伴随对象(模块),而不是案例类!编译错误(您应该发布)与方差无关.它工作,Set如果你这样做:

val allFormats: Set[MediaFormat] = Set(H264_high(), H264_low())
                                                ^^          ^^
Run Code Online (Sandbox Code Playgroud)

或者;

val allFormats = Set[MediaFormat](H264_high(), H264_low())
Run Code Online (Sandbox Code Playgroud)

但是,根据您对问题的描述,将这些作为案例类是没有意义的; 我会把它们变成模块,即

case object H264_syndication extends MediaFormat {
  def status = "off"
  def name = "h264_syndication"
}
Run Code Online (Sandbox Code Playgroud)

然后您的原始代码将正常工作.或者我会按如下方式制作它们:

case class MediaFormat(status: String, name: String)
val H264_syndication = MediaFormat(status ="off", name = "h264_syndication")
Run Code Online (Sandbox Code Playgroud)

我认为这是我的偏好; 我很少使用抽象类来说实话(通常,我是不诚实的).


说明:协方差表示以下内容:

G[S] <: G[T] 当且仅当 S <: T

Set不变的事实意味着a Set[S]不是Set[T](for S <: T)的子类型,但并不意味着这样的a Set[T]可能不包含类型的元素S.