Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.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中Class和Class.type之间的差异_Scala_Types - Fatal编程技术网

Scala中Class和Class.type之间的差异

Scala中Class和Class.type之间的差异,scala,types,Scala,Types,以下片段解释了我的困惑: scala> case class fellow[A, B](name:A, age:B) class fellow scala> :t -v fellow // Type signature fellow.type // Internal Type structure TypeRef( pre = ThisType(class $iw) TypeSymbol(class fellow extends Serializable) ) scala

以下片段解释了我的困惑:

scala> case class fellow[A, B](name:A, age:B)
class fellow

scala> :t -v fellow
// Type signature
fellow.type

// Internal Type structure
TypeRef(
  pre = ThisType(class $iw)
  TypeSymbol(class fellow extends Serializable)
)

scala> :kind -v fellow.type
fellow.type's kind is A
*
This is a proper type.

scala> :kind -v fellow
fellow's kind is F[A1,A2]
* -> * -> *
This is a type constructor: a 1st-order-kinded type.

为什么fellow.type不同于fellow作为一种类型 我不明白为什么这两种类型不同,为什么:t-v返回fellow.type

在做了这个小实验后,我对照列表检查了一下,发现是一样的

scala> :kind -v List
List's kind is F[+A]
* -(+)-> *
This is a type constructor: a 1st-order-kinded type.

scala> :kind -v List.type
scala.collection.immutable.List.type's kind is A
*
This is a proper type.
那么,Exaxly的.type是什么呢?它来自哪里?它和其他的有什么不同。。。Trait Name、Class Name

foo.type对于任何foo都表示foo的类型,即将foo作为其唯一实例的类型。或者,更准确地说,对于AnyRef的实例,只有foo和null作为其实例的类型。请注意,在语法构造foo.type中,foo部分更准确地说是一个值,一个指向值的路径,而foo.type是一个类型

此外,记住相同的名字,也就是说,当你写作时

案件类别foo 还有一个隐含的原因

对象foo 所以这里发生的事情是,当你认为你在问类foo的类型时,你实际上是在问foo的类型。根据定义,单例对象foo的类型是单例类型foo.type。

foo.type对于任何foo都表示foo的类型,即将foo作为其唯一实例的类型。或者,更准确地说,对于AnyRef的实例,只有foo和null作为其实例的类型。请注意,在语法构造foo.type中,foo部分更准确地说是一个值,一个指向值的路径,而foo.type是一个类型

此外,记住相同的名字,也就是说,当你写作时

案件类别foo 还有一个隐含的原因

对象foo
所以这里发生的事情是,当你认为你在问类foo的类型时,你实际上是在问foo的类型。根据定义,单例对象foo的类型是单例类型foo.type。

除了在REPL中添加:t之外,您可以在普通Scala代码中使用typeOf

import scala.reflect.runtime.universe._

typeOf[fellow[_, _]].typeSymbol // class fellow
typeOf[fellow.type].typeSymbol // object fellow
i、 e.类及其伴随对象

对于值,您也可以这样做

def getType[A: TypeTag](a: A): Type = typeOf[A]

getType(fellow("a", 1)).typeSymbol // class fellow
getType(fellow).typeSymbol // object fellow

除此之外,我还要补充一点:在REPL中,您可以在普通Scala代码中使用typeOf

import scala.reflect.runtime.universe._

typeOf[fellow[_, _]].typeSymbol // class fellow
typeOf[fellow.type].typeSymbol // object fellow
i、 e.类及其伴随对象

对于值,您也可以这样做

def getType[A: TypeTag](a: A): Type = typeOf[A]

getType(fellow("a", 1)).typeSymbol // class fellow
getType(fellow).typeSymbol // object fellow

这是类的伴生对象的类型。例如,Nil的类型是Nil.type-请注意,.type语法也可用于访问值的单例类型,即类的伴生对象的类型。例如,Nil的类型是Nil.type-请注意,.type语法也可以用于访问值的单例类型。事实上,从一开始我就不应该这样做:t fellow,因为实际上fellow已经是一个类型。它起作用了,因为我上了案例课。所以从一开始就应该是:k家伙。尽管如此,我理解上述所有观点。我要看一下typeTag alittle@MaatDeamon对于值,还可以使用getType。请看更新。事实上,从一开始我就不应该这样做:t fellow,因为实际上fellow已经是一种类型了。它起作用了,因为我上了案例课。所以从一开始就应该是:k家伙。尽管如此,我理解上述所有观点。我要看一下typeTag alittle@MaatDeamon对于值,还可以使用getType。请参阅更新。