我在Scala上读过一篇关于存在类型的博客:Existential types in Scala
在这篇博客中,它提到了一个例子:
Map[Class[T forSome { type T}], String]
Map[Class[T] forSome { type T}, String]
Map[Class[T], String] forSome { type T}
他的解释。 "第三个是所有地图类型的超类型,因此有一些T使得它们是Map [Class [T],String]。同样,我们在地图中为键提供了一些固定的类类型 - 这次只是我们不知道它是什么类型。然而,中间的键具有Class [T]类型的键,用于某些{type T}。也就是说,它的键是允许其类型参数具有任何值的类。所以这就是我们真正想要的。"
解释并不容易。代码示例中第二个和第三个之间有什么区别?谁能给我们一些例子呢?
博客还提到Map[Class[_], String]
等同于示例中的第三个,当我们真正想要第二个时。当我们将_
用于存在类型时会影响语义吗?
答案 0 :(得分:5)
代码示例中第二个和第三个之间有什么区别?
在第三种类型中,您不能拥有两个Class[T]
类型的密钥,其中T
不同,例如Map(classOf[Object] -> "Object", classOf[String] -> "String")
没有这种类型(但确实有第二种类型)。
博客还提到
Map[Class[_], String]
等同于示例中的第三个,当我们真正想要第二个时。
帖子提到这可能会在将来改变,而且它有。现在它相当于第二个。请参阅Scala Specification中的此示例:
类型
List[List[_]]
等同于存在类型List[List[t] forSome { type t }]
。当我们使用_作为存在类型时会影响语义吗?
这取决于您在特定情况下的需求。如果它提供了您想要的类型(根据上面链接的规范)并且您认为它比_
形式更具可读性,请使用forSome
;否则使用forSome
。