Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.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伴生对象不是单例对象_Scala_Singleton_Companion Object - Fatal编程技术网

Scala伴生对象不是单例对象

Scala伴生对象不是单例对象,scala,singleton,companion-object,Scala,Singleton,Companion Object,我有以下两门课 class A (name: String) { } object A { } 根据Singleton的定义,我们只能有一个该类型的对象。但是,我能够使用下面的代码创建两个不同类型的A对象 object B { def main(args: Array[String]): Unit = { val a = new A("Vinod") println(a) val b = new A("XYZ") println(b) }

我有以下两门课

class A (name: String) {
}

object A {
}
根据Singleton的定义,我们只能有一个该类型的对象。但是,我能够使用下面的代码创建两个不同类型的
A
对象

object B {
   def main(args: Array[String]): Unit = {
     val a = new A("Vinod")
     println(a)

     val b = new A("XYZ")
     println(b)
  }
}

有人能解释一下我的理解有哪些地方不正确吗?

伴生对象可以被认为是类的静态空间。如果你想制作一个单体,你可以将它制作成一个对象而不是一个类

新的A
指的是
类A
(它不是单体),而不是
对象A
。您可以轻松地检查它:如果删除
class A
,则
新的A
行将不再编译


还要注意,
对象
不一定是单例:它们可以嵌套在类或特征中,在这种情况下,外部类型的每个实例都有一个。

伴生对象不是伴生类的实例。他们甚至不是同一类型

class A
object A {
  var state = 0
  def update() :Unit = state = state + 1
}

val abc :A = new A   //instance of class A
val xyz :A.type = A  //2nd reference to object A

// both reference the same singleton object
xyz.update()  //res0: Unit = ()
A.state       //res1: Int = 1
abc.state     //Error: value state is not a member of A$A2521.this.A

对象本身就是一个单例对象。它有自己的类,并且在运行时不存在同一类的其他实例

但是,您在这里描述的模式不同:
对象A
不是类
A
的实例,除非您使用
对象A扩展了类A
。通过使class
A
A
sealed
class,您可以使其成为class
A
的唯一实例,但这在几乎所有情况下都是不必要的

如果您真的想要单例模式,请删除
,只使用
对象A
,它的所有成员都将是Java意义上的“静态”成员


请注意,
对象A
的实际类型可以称为
A.type
,默认情况下,如果存在类
A
,则该类型与类型
A
完全无关。同样地,
A.type
可以是
A
的子类型,如果您明确地这样做的话。

我理解companion object的用法。问题是它违反了单身的定义。A的伴生对象本身不是类型A。伴星对象实际上是一个单体。这可能有点混乱,但实际上是有道理的。您可以
隐式地[A.type=:=A]
并看到它找不到实例。类型是AI的伴生对象的类型。我理解@jwvh提供的代码。谢谢你的帮助,让我的理解有点清楚:)这有点误导我。对象是单例的,因为它们有自己的类型。如果对象
O
嵌套在类
C
中,并且您有一个
C
的实例
C
,那么对象的类型是
C.O.type
,并且没有此类型的其他实例。“该类型”在Scala中有问题。1.
c
也是
c.type
的唯一实例。2.原则上,所有
O
s都应该有一个公共类型(而不是
O
的超类型)。它在Scala中似乎是不可写的:但我看不出它不应该被写的原因。我同意你的观点,除了编译器生成了与
O
对应的真正“类型”,因此
O.type
O
的唯一代码可以访问的类型。这不是
c
的情况,我们可以对所有实例使用
c
,如果我们需要特别参考
c
,则可以使用
c.type
。很好的例子,我得到了您想要表达的要点:)谢谢:)