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)。