微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Scala的any列表和扩展Any的列表有什么区别?

如何解决Scala的any列表和扩展Any的列表有什么区别?

谁能解释一下两者之间的区别: Seq[Any]Seq[_ <: Any]吗?
在我看来,我可以将两种情况都放在Any上。

解决方法

这里没有区别,因为Seq is covariant。所以:

  1. Seq[Any]Seq[_ <: Any]的子类型,因为_可能是Any;

  2. Seq[_ <: Any]Seq[Any]的子类型,因为无论您放置什么而不是_,都会得到Seq[Any]的子类型。

如果您将Seq替换为某些不变的F(例如Set),则Set[Any]Set[_ <: Any]的子类型,反之亦然。 Set[_ <: Any]Set[Any]Set[String]Set[Int]等的常见超类型。

详细信息:

  1. Set[_ <: Any]Set[T] forSome { T <: Any }的简写。

  2. Set[T] forSome { T <: Any }是满足Set[T]的类型T的所有T <: Any的超类型。规范says

    由存在性类型T forSome {Q}表示的一组值是其所有类型实例的一组值的并集。

    但这是同一回事。

像这样的代码

val set1: Set[String] = ??? 
val set2: Set[_ <: Any] = set1

将进行编译(尝试!)。如果您将String替换为任何其他类型(_ <: ...不是一种类型),它仍然会。但是

val set1: Set[String] = ??? 
val set2: Set[Any] = set1

不会。

,

我将在 @AlexeyRomanov 的答案中添加对Scala规范中特定位置的引用:

3.2.12存在类型

简化规则

4。其中? forSome { ? }包含子句类型?的存在类型?[tps]>:?<:?等同于?′ forSome { ? }由{{1}产生的类型?′ },替换每个协变量 ??中出现?,并替换了 ???的反变出现。

https://scala-lang.org/files/archive/spec/2.13/03-types.html#simplification-rules

?Seq[_ <: Any]Seq[T] forSome { type T <: Any}T的发生是协变的,因为Seq[T]是协变的,所以Seq(最后一步也使用简化规则2)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。