これは、暗黙を使用したくないが、(たとえば) から に変換する関数が必要な場合に便利Int
ですMyClass
。
2 に答える
Scala では、object
静的メソッドを定義するために an が使用されます。あなたが説明していることは、あなたがこれを望んでいるように聞こえます:
class MyClass(n: Int)
object MyClass {
def apply(n: Int) = new MyClass(n)
}
次のいずれかを実行できるようにします。
scala> val a = MyClass.apply(3)
a: MyClass = MyClass@70d1c9b5
scala> val b = MyClass(3) // works allowed because method is called "apply"
b: MyClass = MyClass@1b4b2db7
私はこれを「ファクトリーメソッド」と呼んでいます。
コンパニオンオブジェクトにメソッドを入れて、Scalaから静的な方法で(つまり、オブジェクトインスタンスなしで)呼び出すことができます。
// Scala
class A
object A {
def staticMethod = println("Foo!")
}
A.staticMethod // prints "Foo!"
Scalaコンパイラは実際にA$
はシングルトンobject A
を呼び出す新しい合成クラスを作成するため、この行は実行時に存在するA.staticMethod
単一のインスタンスでメソッドを呼び出すことに注意してください。A$
注目すべき点:Scalaコンパイラーはバイトコードレベルで静的メソッドも作成しstaticMethod
、A
呼び出しを転送しますA$.staticMethod
-プロジェクトでJavaコードとScalaコードを混合している場合、これはJavaからこの静的メソッドを呼び出すこともできることを意味しますこのような:
// Java
A.staticMethod(); // works
ただし、コンパニオンクラスで同じ名前のメソッドを宣言するとA
、Scalaでもすべてが同じように機能しますが、の静的フォワーダーメソッドは生成A
されずstaticMethod
、Javaから呼び出すことはできません。
// Scala
class A {
def staticMethod = println("I'm doing something else.")
}
object A { // no companion class
def staticMethod = println("Foo!")
}
A.staticMethod // prints "Foo!"
// Java
A.staticMethod(); // won't work