我对scala非常陌生,现在我必须处理一个用scala和java编写的项目。我遇到了这种类似的结构:
class SomeType{
//...
}
trait Trait1 extends scala.AnyRef{
}
trait Trait2 extends extends scala.AnyRef{
}
class MyClass(arg : SomeType) extends Trait1{
//...
}
object MyClass extends Trait2{
//...
}
这是一种令人头脑麻木的麻木。据我所知,answer我可以认为object
只是抽象方法的类。即我们可以(在我看来)用java中的Class<T>
对象定义一些映射。
但在此示例中,class
和object
扩展了 不同的 trait
。这就是我真正感到困惑的地方。我无法想象这意味着什么以及为何使用它。
答案 0 :(得分:8)
我试图从了解Java的人的角度解释Scala object
是什么。
在Java中,您可以定义&#34; normal&#34;班级成员和static
班级成员。当Java中的某些东西(例如成员变量)是static
时,那里只有该成员变量的一个实例,该实例由该类的所有实例共享。
在Scala中,没有static
。与Java相比:无论您在Java中使用static
,您都会在Scala中添加object
。
Scala object
是一个单例 - 它只有一个实例,就像Java中的static
成员一样,只有一个实例。
我希望能更清楚地了解Scala object
究竟是什么。
Scala object
可以像任何其他类或特征一样扩展类或特征,以便它继承在其扩展的类或特征中定义的内容。真的没有理由为什么这不可能。
请注意,如果您有class
和object
同名,那么这两个属于一起 - 他们可以看到彼此的私人成员。 object
被称为班级的伴侣对象。
请注意,不意味着object
是该类的实例。它不是 - 它是一个独立的东西站在课堂旁边。也许你对类和对象扩展不同特征的困惑来自于对这一点的误解。
答案 1 :(得分:1)
一个类与其他语言的任何其他类一样。您可以像定义任何其他语言一样定义类,就像其他任何语言一样。另外,case classes中定义了一些方便的方法,可以轻松地初始化对象。
class Person(val name: String)
val me = new Person("My name")
但是,对象是仅具有单个对象的类。这很有趣,因为它可以用于使用 companion对象创建类的静态成员。该伴随对象可以访问类定义的私有成员,并且与您要定义的类具有相同的名称。
class Person(var name: String) {
import Person._
def hi(): String = sayHello(name)
}
object Person {
private def sayHello(name: String): String = "Hello " + name
}
val me = new Person("My name")
me.hi()
此外,值得注意的一点是对象类是延迟创建的,这是另一个要点。因此,除非我们的代码中需要它们,否则它们不会被实例化。
如果要为JDBC定义连接创建,可以像在Java中使用单例对象那样在对象内部创建它们以避免重复。