当我不想使用隐式但希望有一个函数从 (eg) 转换Int
为MyClass
.
问问题
488 次
2 回答
4
在 Scala 中,anobject
用于定义静态方法。你所描述的听起来像你想要的:
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$
singleton的新合成类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
于 2012-10-10T22:56:30.690 回答