在Scala中存在类型的下划线

Pun*_*tan 6 scala existential-type

我读过一篇关于Scala中存在类型的博客:Scala中的存在类型

在这篇博客中,它提到了一个例子:

Map[Class[T forSome { type T}], String]
Map[Class[T] forSome { type T}, String]
Map[Class[T], String] forSome { type T}
Run Code Online (Sandbox Code Playgroud)

他的解释."第三个是所有地图类型的超类型,因此有一些T使得它们是Map [Class [T],String].再次,我们在地图中为键提供了一些固定的类类型 - 它是只是这次我们不知道它是什么类型.但是中间的类型具有Class [T]类型的键,用于某些{类型T}.也就是说,它的键是允许具有他们想要的任何值的类.类型参数.这就是我们真正想要的."

解释并不容易.代码示例中第二个和第三个之间有什么区别?有人能给我们一些例子吗?

博客还提到了Map[Class[_], String]相当于示例中的第三个,当我们真正想要第二个时.当我们_用于存在类型时,这会影响语义吗?

Ale*_*nov 5

代码示例中第二个和第三个之间有什么区别?

在第三种类型中,你不能有两个类型Class[T]不同的键T,例如Map(classOf[Object] -> "Object", classOf[String] -> "String")没有这种类型(但它有第二种类型).

博客还提到了Map[Class[_], String]相当于示例中的第三个,当我们真正想要第二个时.

该帖子提及将来可以改变它,它有.现在它相当于第二个.请参阅Scala规范中的此示例:

类型List[List[_]]等同于存在类型List[List[t] forSome { type t }].

当我们使用_作为存在类型时,这会影响语义吗?

这取决于您在特定情况下的需求.使用_,如果它给你想要的类型(根据上面链接的规范),你认为这是不是更可读forSome的形式; forSome否则使用.