内部对象与Scala中的伴随对象

时间:2018-04-12 03:08:20

标签: scala

任何人都可以建议以下

之间的区别
Class A{
 object A{
 }
}

Class A{

}
object A{

}

2 个答案:

答案 0 :(得分:1)

来自scala doc: https://docs.scala-lang.org/tour/singleton-objects.html

与类同名的对象称为伴随对象。相反,该类是对象的伴侣类。伴随类或对象可以访问其伴随的私有成员。 将伴随对象用于非特定于伴随类实例的方法和值。

对于第一种情况:

您可以使用像new A().A

这样的对象

答案 1 :(得分:1)

不同之处在于,在第一种情况下,您具有路径依赖类型。

让我们重新格式化您的代码并将案例分开以便编译:

class A {
  object A
}

class B
object B

现在请注意:

new A().A == new A().A // false
B == B // true

因此,虽然第一个实例的A与第二个实例的A不同,但B完全相同。

我想补充一点,这不是内部对象与类的问题。 即使内部类型是类而不是对象,它也会是相同的。我建议您阅读Daniel Westheide撰写的this great post,但基本上让我们在Character内定义Franchise(此时恰好是一个班级):

class Franchise(name: String) {
  case class Character(name: String)
  def createFanFictionWith(
    lovestruck: Character,
    objectOfDesire: Character): (Character, Character) = (lovestruck, objectOfDesire)
}

现在给予两个不同的特许经营权,starTrekstarWars,来自同一特许经营权的角色将来自同一类型,而来自不同特许经营权的角色将来自另一种类型:

// creating two franchise
val starTrek = new Franchise("Star Trek")
val starWars = new Franchise("Star Wars")

// quark and jadzia belong to the same franchise (Star Trek)
val quark = starTrek.Character("Quark")
val jadzia = starTrek.Character("Jadzia Dax")

// luke and yoda belong to the same franchise (Star Wars)
val luke = starWars.Character("Luke Skywalker")
val yoda = starWars.Character("Yoda")

所以现在夸克可以迷恋jadzia,而且卢克可以迷恋尤达:

starTrek.createFanFictionWith(lovestruck = quark, objectOfDesire = jadzia)
starWars.createFanFictionWith(lovestruck = luke, objectOfDesire = yoda)

但是jadzia不能迷恋卢克,因为他们的jadzia类型是starTrek.Character但是luke的类型是starWars.Character

starTrek.createFanFictionWith(lovestruck = jadzia, objectOfDesire = luke) // DOES NOT COMPILE :)

这个例子来自丹尼尔的帖子,而且 - 我强烈建议你阅读它。