gpt4 book ai didi

scala - 类的实例与其伴生对象之间的关系

转载 作者:行者123 更新时间:2023-12-01 01:57:59 25 4
gpt4 key购买 nike

我有以下类和同伴对象:

class TestMatch(val i: Int)

object TestMatch{
def apply(i: Int) = new TestMatch(i)
def unapply(tm : TestMatch): Option[Int] = Some(tm.i)
}

现在考虑以下简单程序:
println("isAssignableFrom: " + classOf[TestMatch].isAssignableFrom((tm.getClass)))
println("equality: " + classOf[TestMatch].equals((tm.getClass)))
println("instanceOf:" + TestMatch.isInstanceOf[TestMatch])

它打印:
isAssignableFrom: true
equality: true
instanceOf:false

这怎么可能?还没有在 Java 中遇到过这个。

最佳答案

您指的不是同一个 TestMatch每个示例中的概念。

  • classOf[TestMatch]instanceOf[TestMatch]引用 TestMatch作为一种。单例不定义类型。
  • TestMatch.something()是对单例对象的方法的调用 TestMatch

  • 现在可能有点令人困惑的是以下内容:
    object Singleton
    println(Singleton.isInstanceOf[Singleton]) // prints true

    我猜当单例是伴随对象时,Scala 会优先考虑类。

    编辑:

    正如阿列克谢·罗曼诺夫指出的那样, scala.Singleton实际上是在 Scala SDK 中定义的,每个单例对象都扩展了它……让我们用一个不同的名字重新开始:
    object MySingleton
    println(MySingleton.isInstanceOf[MySingleton])

    这不会编译,因为单例没有定义类型。有一种方法可以让它编译。
    println(MySingleton.isInstanceOf[MySingleton.type]) // true

    这就是你如何证明你指的不是同一件事。最后一个例子,让我们试试
    class MyClassWithCompanion
    object MyClassWithCompanion

    val x = new MyClassWithCompanion

    println(MyClassWithCompanion.isInstanceOf[MyClassWithCompanion]) // false
    println(MyClassWithCompanion.isInstanceOf[MyClassWithCompanion.type]) // true
    println(MyClassWithCompanion.isInstanceOf[x.type] // false

    这很微妙,但这就是它的意思:
  • .type是应用于实例并返回其类型
  • 的运算符
  • x.type只能在 x 时定义是某物的一个实例,所以 MyClass.type除非这个类有一个伴生对象,否则不会编译。因此,MyClassWithCompanion.type必然是指伴随对象(它是一个实例)而不是类本身
  • 同伴的类型和类(class)本身的类型是不同的。您无法替换 X 的实例与单例 X ,这是有道理的,因为它们具有不同的性质。
  • 关于scala - 类的实例与其伴生对象之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38943033/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com