2016-06-16 8 views
0

私はスカラにはとても新しいので、スカラと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は抽象メソッドを持つクラスとして考えることができます。私。私は(私の意見では)Class<T>オブジェクトを使ってJavaでマッピングを定義することができました。

しかし、この例ではclassobject異なるtrait Sを拡張します。それが私が本当に混乱していたものです。私はそれが何を意味し、なぜそれが使われたのか想像できません。

+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である場合、そのメンバ変数のインスタンスは1つしかなく、クラスのすべてのインスタンスで共有されます。

Scalaでは、staticはありません。 Javaと比較して:staticをJavaで作成する場合は、Scalaでobjectを入力します。

Scala objectはシングルトンです。つまり、インスタンスが1つしかないJavaのメンバーstaticのように、1つのインスタンスしか存在しません。

Scala objectが正確であることを少しはっきりさせることを望みます。

Scala objectは、他のクラスや特性と同様にクラスや特性を拡張することができるため、拡張するクラスや特性で定義されたものを継承することができます。これが不可能ではない理由はありません。

classと同じ名前のobjectがある場合、それらの2つは一緒に属します。つまり、お互いのプライベートメンバーを見ることができます。 objectは、クラスののコンパニオンオブジェクトと呼ばれます。

これはではありません。は、objectがクラスのインスタンスであることを意味します。そうではありません - それはクラスの横に立つ独立したものです。多分、あなたのクラスや目的についての混乱は、その点についての誤解から来ています。

関連する問題