Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 声明站点的存在类型_Scala_Existential Type - Fatal编程技术网

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

我在玩Scala时发现它编译:

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]