问题描述
谁能解释一下两者之间的区别:
Seq[Any]
和Seq[_ <: Any]
吗?
在我看来,我可以将两种情况都放在Any
上。
解决方法
这里没有区别,因为Seq
is covariant。所以:
-
Seq[Any]
是Seq[_ <: Any]
的子类型,因为_
可能是Any
; -
Seq[_ <: Any]
是Seq[Any]
的子类型,因为无论您放置什么而不是_
,都会得到Seq[Any]
的子类型。
如果您将Seq
替换为某些不变的F
(例如Set
),则Set[Any]
是Set[_ <: Any]
的子类型,反之亦然。 Set[_ <: Any]
是Set[Any]
,Set[String]
,Set[Int]
等的常见超类型。
详细信息:
-
Set[_ <: Any]
是Set[T] forSome { T <: Any }
的简写。 -
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)。