Scala 声明站点的存在类型
我在玩Scala时发现它编译:Scala 声明站点的存在类型,scala,existential-type,Scala,Existential Type,我在玩Scala时发现它编译: class Foo[_] 类声明中存在类型的作用是什么?不确定,但它似乎相当于: scala> class Foo[T >: Nothing <: AnyRef] defined class Foo 这是合法的,因为语法的以下部分(在中给出): TmplDef::='class'ClassDef ClassDef::=id[TypeParamClause]{Annotation} [AccessModifier]类参数子句类模板选项 Type
class Foo[_]
类声明中存在类型的作用是什么?不确定,但它似乎相当于:
scala> class Foo[T >: Nothing <: AnyRef]
defined class Foo
这是合法的,因为语法的以下部分(在中给出):
TmplDef::='class'ClassDef
ClassDef::=id[TypeParamClause]{Annotation}
[AccessModifier]类参数子句类模板选项
TypeParamClause::='['VariantTypeParam{','VariantTypeParam}']
VariantTypeParam::={Annotation}['+'|'-']TypeParam
TypeParam::=(id |'')[TypeParamClause]['>:'Type]['你是对的,存在类型不使用下划线。但我必须是盲的,因为我根本找不到规范中定义存在类型的下划线语法的位置。@drhagen第27页,“存在类型的占位符语法”很抱歉,我看到了,但是我看不到在任何其他语法中,通配符类型
在哪里被引用,这将表明通配符存在形式在哪里是合法的。@drhagen“通配符类型必须作为参数化类型的类型参数出现……通配符类型也可能作为中缀类型(§3.2.8)、函数类型(§3.2.9)的一部分出现,或元组类型(§3.2.5)。它们的扩展就是等效参数化类型中的扩展。”虽然我同意,定义WildcardType
非终端,不在任何地方引用它没有多大意义。有没有理由拥有一个无法访问的类型参数?我的意思是,Scala不会让我拥有一个无法访问的常规参数,比如def-foo(uquo:Int):Unit=()//错误
。它的用处在于更高级的类型:函子[F[\u]]]
(函子[F[X]]
是等价的,但我认为第一个更清楚,因为名称不相关)。当然,语法可以区分顶级和嵌套的TypeParamClause。
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
TmplDef ::= ‘class’ ClassDef
ClassDef ::= id [TypeParamClause] {Annotation}
[AccessModifier] ClassParamClauses ClassTemplateOpt
TypeParamClause ::= ‘[’ VariantTypeParam {‘,’ VariantTypeParam} ‘]’
VariantTypeParam ::= {Annotation} [‘+’ | ‘-’] TypeParam
TypeParam ::= (id | ‘_’) [TypeParamClause] [‘>:’ Type] [‘<:’ Type] [‘:’ Type]