2015-09-08 78 views
6

生存型我看過一個關於生存型博客在斯卡拉: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] forSome {type T}。也就是說,它的鍵是允許有他們想要的任何值的類類型參數,所以這就是我們真正想要的。「

解釋不容易。代碼示例中的第二個和第三個之間有什麼區別?任何人都可以舉一些例子嗎?

博客還提到Map[Class[_], String]相當於示例中的第三個,當我們確實需要第二個時。當我們使用_作爲存在類型時,這會影響語義嗎?

回答

5

代碼示例中的第二個和第三個之間有什麼區別?

在第三類型不能具有不同T,例如Class[T]類型的兩個鍵Map(classOf[Object] -> "Object", classOf[String] -> "String")不具有此類型(但具有第二種類型)。

博客還提到,Map[Class[_], String]相當於示例中的第三個,當我們確實需要第二個時。

該帖子提到這可能會在將來改變,它已經。現在它相當於第二個。看到這個例子中Scala Specification

類型List[List[_]]等效於存在類型List[List[t] forSome { type t }]

當我們將_用於存在類型時,這會影響語義嗎?

這取決於你想要在你的具體情況。使用_如果它提供了您想要的類型(根據以上鍊接的規範),並且您認爲它比forSome表單更具可讀性;否則使用forSome