2016-06-16 34 views
0

我对scala非常陌生,现在我必须处理一个用scala和java编写的项目。我遇到了这样的建设:了解scala中的类和对象

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 s只是抽象方法的类。即我们可以(在我看来)在java中定义一些与Class<T>对象的映射。

但在这个例子classobject延伸不同trait秒。这就是我真的很困惑。我无法想象它是什么意思,为什么它被使用。

+3

你的问题到底是什么? – marstran

+3

我们不能将对象看作具有抽象方法的类。对象只是单身人士。 – dk14

+1

你引用的答案是将对象看作是“隐式定义的类的单例”。也就是说,它也是一个对象。也许下面的链接可以帮助你:http://docs.scala-lang.org/tutorials/tour/singleton-objects.html。最值得注意的是它说“scala中没有静态关键字”。所以,对象被用在java程序员会认为静态的地方。为什么区别?他们来自不同的思想流派。 Scala受Haskell影响很大,Java受C/C++影响很大。 –

回答

7

我会试着从一个知道Java的人的角度解释Scala object是什么。

在Java中,您可以定义“普通”类成员和static类成员。当某些东西(例如一个成员变量)在Java中为static时,那么该成员变量只有一个实例,该实例由该类的所有实例共享。在斯卡拉,没有static。与Java相比:无论您使用Java创建static,您都可以在Scala中输入object

斯卡拉object是一个单例 - 它只有一个实例,就像其中只有一个实例的Java中的static成员一样。

我希望能让它更清楚一点Scala object究竟是什么。

斯卡拉object可以像其他任何类或特征一样扩展类或特征,以便继承它在扩展的类或特征中定义的任何内容。真的没有理由为什么这是不可能的。

请注意,如果您有一个class和一个object具有相同的名称,那么这两个属于一起 - 他们可以看到彼此的私人成员。 object被称为伴随对象的类。

请注意,这不是而不是意味着object是该类的一个实例。它不是 - 它是一个独立的东西,站在课堂旁边。也许你对扩展不同特征的类和对象的困惑来自对这一点的误解。