【问题标题】:Difference between Class and Class.type in ScalaScala中Class和Class.type之间的区别
【发布时间】:2021-02-19 23:41:10
【问题描述】:

下面的sn-p解释了我的困惑:

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 ?

在这个小实验之后写,我检查了 List,发现它是一样的

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.

那么 .type 到底是什么?它从何而来 ?它与其他有什么不同...特征名称,类名称

【问题讨论】:

  • 即类的伴生对象的类型。例如 Nil 的类型是 Nil.type - 请注意,.type 语法可用于访问值的单例类型。

标签: scala types


【解决方案1】:

foo.type 对于任何foo 表示foosingleton type,即具有foo 作为其唯一实例的类型。 (或者,更准确地说,对于 AnyRef 的实例,只有 foonull 作为其实例的类型。)请注意,在句法构造中 foo.type foo 部分是 (更准确地说,是一个值的路径),而foo.type是一个类型

另外,请记住 a case class automatically generates a companion module 同名,即无论何时写

case class foo

还有一个隐含的

object foo

所以这里发生的事情是,当你认为你在询问 class foo 的类型时,你实际上 > 询问singleton object foo 的类型。而单例对象foo的类型,顾名思义就是单例类型foo.type

【讨论】:

    【解决方案2】:

    我只是补充一点,除了 REPL 中的 :t 之外,您还可以在普通 Scala 代码中使用 typeOf

    import scala.reflect.runtime.universe._
    
    typeOf[fellow[_, _]].typeSymbol // class fellow
    typeOf[fellow.type].typeSymbol // object fellow
    

    即一个类及其伴随对象。

    对于值你也可以这样做

    def getType[A: TypeTag](a: A): Type = typeOf[A]
    
    getType(fellow("a", 1)).typeSymbol // class fellow
    getType(fellow).typeSymbol // object fellow
    

    【讨论】:

    • 其实从一开始我就不应该做:t fellow,因为其实伙计已经是一个类型了。它起作用了,因为我有一个案例课。所以从一开始就应该如此。 :k fellow 。话虽这么说,我理解以上所有观点。我会稍微看一下 typeTag
    • @MaatDeamon 对于值,您也可以使用getType。查看更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 2014-01-31
    • 2018-11-02
    • 2016-04-13
    相关资源
    最近更新 更多