在Scala中存在类型的下划线

时间:2015-09-08 01:00:17

标签: scala existential-type

我在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]等同于示例中的第三个,当我们真正想要第二个时。当我们将_用于存在类型时会影响语义吗?

1 个答案:

答案 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