任何人都可以建议以下
之间的区别Class A{
object A{
}
}
和
Class A{
}
object A{
}
答案 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)
}
现在给予两个不同的特许经营权,starTrek
和starWars
,来自同一特许经营权的角色将来自同一类型,而来自不同特许经营权的角色将来自另一种类型:
// 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 :)
这个例子来自丹尼尔的帖子,而且 - 我强烈建议你阅读它。