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
。通过使classA
Asealed
class,您可以使其成为classA
的唯一实例,但这在几乎所有情况下都是不必要的
如果您真的想要单例模式,请删除类
,只使用对象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
。很好的例子,我得到了您想要表达的要点:)谢谢:)