申报地点的存在类型

时间:2014-09-10 12:44:31

标签: scala existential-type

当我发现编译时,我正在玩Scala:

class Foo[_]

类声明中的存在类型有什么作用?

2 个答案:

答案 0 :(得分:4)

不确定,但似乎相当于:

scala> class Foo[T >: Nothing <: AnyRef]
defined class Foo

只是您无法访问T。这可以通过使用-Xprint:all检查编译来确认。它们都产生相同的AST。

玩耍:

scala> new Foo
res3: Foo[Nothing] = Foo@de0a01f

scala> new Foo[String]
res4: Foo[String] = Foo@47fd17e3

scala> class Foo2[_]
defined class Foo2

scala> new Foo2[String]
res5: Foo2[String] = Foo2@2d6e8792

答案 1 :(得分:4)

这是合法的,因为遵循部分语法(在Scala specification中给出):

TmplDef ::= ‘class’ ClassDef
ClassDef ::= id [TypeParamClause] {Annotation}
  [AccessModifier] ClassParamClauses ClassTemplateOpt
TypeParamClause ::= ‘[’ VariantTypeParam {‘,’ VariantTypeParam} ‘]’
VariantTypeParam ::= {Annotation} [‘+’ | ‘-’] TypeParam
TypeParam ::= (id | ‘_’) [TypeParamClause] [‘>:’ Type] [‘<:’ Type] [‘:’ Type]

我相信_只是最终成为一个类型参数名称(它实际上并不在类体中使用),而不是存在类型语法的一部分。