1

当我不想使用隐式但希望有一个函数从 (eg) 转换IntMyClass.

4

2 回答 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 编译器还在字节码级别创建了一个静态方法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 回答