【问题标题】:Is companion always instance of the class?同伴总是类的实例吗?
【发布时间】:2016-08-14 20:48:53
【问题描述】:

我阅读了the article 中有关 scala 中的单例对象的信息,但没有发现它是否是该类的实例。 下面的简单程序告诉我们,对于这种特殊情况,它是正确的:

class TestMatch(val i: Int)

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

我试着这样测试它:

println(TestMatch.isInstanceOf[TestMatch]) //false

但它生成了警告fruitless type test。 我不确定如何进行这样的测试。

【问题讨论】:

  • 不确定你在这里证明了什么 - 如果你完全删除对象,你仍然会得到相同的结果 - tm 是 TestMatch 类的一个实例,这些都不是指TestMatch 伴随对象。
  • @TzachZohar 是的,我刚刚注意到了。但是原来的问题呢。伴生对象的类型是什么?
  • @TzachZohar 我刚刚编辑了我的问题
  • object TestMatch 的类型是TestMatch$。您可以使用TestMatch.getClass 进行检查。 它不是类TestMatch的实例!但是你可以通过扩展它来实现,当然......

标签: scala singleton


【解决方案1】:

objects 始终是匿名类的实例,其主体是 object 定义的主体。如果定义不包含extends 子句,则该类直接继承自AnyRef。

所以TestMatch 对象可能是TestMatch 类的实例的唯一方法是如果您编写object TestMatch extends TestMatch(something) {...}。由于您没有这样做,TestMatch 不是您代码中 TestMatch 的实例。

PS:您收到测试代码警告的原因是 Scala 在编译时已经知道 TestMatch 的确切类型,因此它知道运行时测试只能导致 @ 987654331@,因此是“没有结果的”。通常,当某些事物的确切类型直到运行时才确定时,您会使用运行时类型测试,因此测试可能是真或假。

【讨论】:

  • Nitpick:来自AnyRef,而不是来自Any。
猜你喜欢
  • 2016-02-13
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 2012-11-02
  • 2012-05-05
  • 1970-01-01
相关资源
最近更新 更多