当我发现编译时,我正在玩Scala:
class Foo[_]
类声明中的存在类型有什么作用?
答案 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]
我相信_
只是最终成为一个类型参数名称(它实际上并不在类体中使用),而不是存在类型语法的一部分。