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 Namefoo.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。请参阅更新。