Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 协方差与Scala集合_List_Scala_Set_Covariance - Fatal编程技术网

List 协方差与Scala集合

List 协方差与Scala集合,list,scala,set,covariance,List,Scala,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

我试图了解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"
}
我想做的是拥有一套所有这些格式,因为我需要一个集合,其中每种格式只出现一次,所以我尝试:

object MediaFormat {
    val allFormats:Set[MediaFormat] = Set(H264_high,H264_low)
}
这给了我一个编译时异常,因为正如我现在所理解的,Set是不变的

所以我想,我想我只需要使用一个列表,自己管理重复的值

但我试着这样做:

object MediaFormat {
    val allFormats:List[MediaFormat] = List(H264_high,H264_low)
}
因为据我所知,列表是协变的,但它仍然无法编译


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

它不会编译,因为您引用的是配套的对象模块,而不是案例类!您应该发布的编译错误与差异无关。如果执行以下操作,它将与Set一起工作:

val allFormats: Set[MediaFormat] = Set(H264_high(), H264_low())
                                                ^^          ^^
或者选择

val allFormats = Set[MediaFormat](H264_high(), H264_low())
然而,鉴于您对问题的描述,将这些作为案例类是没有意义的;我只需要制作模块,即

case object H264_syndication extends MediaFormat {
  def status = "off"
  def name = "h264_syndication"
}
那么您的原始代码就可以正常工作了。或者,我会按照如下方式制作VAL:

case class MediaFormat(status: String, name: String)
val H264_syndication = MediaFormat(status ="off", name = "h264_syndication")
我想这是我的偏好;我很少再使用抽象类了。老实说,我是不诚实的

说明:协方差是指以下各项:

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"
}

G[S]它不会编译,因为您引用的是伴随对象模块,而不是case类!您应该发布的编译错误与差异无关。如果执行以下操作,它将与Set一起工作:

val allFormats: Set[MediaFormat] = Set(H264_high(), H264_low())
                                                ^^          ^^
或者选择

val allFormats = Set[MediaFormat](H264_high(), H264_low())
然而,鉴于您对问题的描述,将这些作为案例类是没有意义的;我只需要制作模块,即

case object H264_syndication extends MediaFormat {
  def status = "off"
  def name = "h264_syndication"
}
那么您的原始代码就可以正常工作了。或者,我会按照如下方式制作VAL:

case class MediaFormat(status: String, name: String)
val H264_syndication = MediaFormat(status ="off", name = "h264_syndication")
我想这是我的偏好;我很少再使用抽象类了。老实说,我是不诚实的

说明:协方差是指以下各项:

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"
}

非常感谢,我很高兴我对集合不变性的认识是错误的。这让事情变得容易多了@保罗:关于集合不变性,你没有错。集合[H264_low]不是集合[MediaFormat]的子类型。但是,由于H264_low是MediaFormat的一个子类型,您可以将它放在一个集合[MediaFormat]中。丹尼尔-我的回答是这样的吗-假设Paul对集合的不变性说错了,他对集合不变性的理解是错的,这就是我的意思,谢谢你添加了关于使用VAL的最后一部分,这肯定会让我做的更容易。我偶然发现了另一个问题,你们现在也解决了。非常感谢——我很高兴我对集合不变性的看法是错误的。这让事情变得容易多了@保罗:关于集合不变性,你没有错。集合[H264_low]不是集合[MediaFormat]的子类型。但是,由于H264_low是MediaFormat的一个子类型,您可以将它放在一个集合[MediaFormat]中。丹尼尔-我的回答是这样的吗-假设Paul对集合的不变性说错了,他对集合不变性的理解是错的,这就是我的意思,谢谢你添加了关于使用VAL的最后一部分,这肯定会让我做的更容易。我偶然发现了另一个问题,你们现在也解决了。