1

これは、暗黙を使用したくないが、(たとえば) から に変換する関数が必要な場合に便利IntですMyClass

4

2 に答える 2

4

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

私はこれを「ファクトリーメソッド」と呼んでいます。

于 2012-10-10T21:54:07.967 に答える
1

コンパニオンオブジェクトにメソッドを入れて、Scalaから静的な方法で(つまり、オブジェクトインスタンスなしで)呼び出すことができます。

// Scala
class A
object A {
  def staticMethod = println("Foo!")
}
A.staticMethod // prints "Foo!"

Scalaコンパイラは実際にA$はシングルトンobject Aを呼び出す新しい合成クラスを作成するため、この行は実行時に存在するA.staticMethod単一のインスタンスでメソッドを呼び出すことに注意してください。A$

注目すべき点:Scalaコンパイラーはバイトコードレベルで静的メソッドも作成しstaticMethodA呼び出しを転送します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
于 2012-10-10T22:56:30.690 に答える