当我不想使用implicits但希望有一个函数可以从(例如)Int
转换为MyClass
时,这非常有用。
答案 0 :(得分:4)
在Scala中,object
用于定义静态方法。您所描述的内容听起来像是您想要的:
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
我称之为“工厂方法”。
答案 1 :(得分:1)
您可以将一个方法放入随播对象中,以便从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
中的静态转发器方法将不生成,您将无法从Java调用staticMethod
:
// 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