Bob*_*r02 89 scala keyword new-operator
我有一个非常简单的问题 - 在Scala中创建对象时应该何时应用new关键字?是在我们尝试仅实例化Java对象时?
Owe*_*wen 133
new如果要引用class自己的构造函数,请使用关键字:
class Foo { }
val f = new Foo
Run Code Online (Sandbox Code Playgroud)
new如果你指的是伴侣对象的apply方法,则省略:
class Foo { }
object Foo {
def apply() = new Foo
}
// Both of these are legal
val f = Foo()
val f2 = new Foo
Run Code Online (Sandbox Code Playgroud)
如果你做了一个案例类:
case class Foo()
Run Code Online (Sandbox Code Playgroud)
Scala秘密为你创建了一个伴侣对象,将其转化为:
class Foo { }
object Foo {
def apply() = new Foo
}
Run Code Online (Sandbox Code Playgroud)
所以你可以做到
f = Foo()
Run Code Online (Sandbox Code Playgroud)
最后,请记住,没有规则表明随播apply
方法必须是构造函数的代理:
class Foo { }
object Foo {
def apply() = 7
}
// These do different things
> println(new Foo)
test@5c79cc94
> println(Foo())
7
Run Code Online (Sandbox Code Playgroud)
而且,既然你提到了Java类:是的 - Java类很少有带有apply方法的伴随对象,所以你必须使用new和实际类的构造函数.
om-*_*nom 15
是在我们尝试仅实例化java对象时?
一点也不.new在scala中省略时有两种常见情况.使用单例对象(通常用于存储静态函数,并且作为一种类似于您在java中看到的工厂):
scala> object LonelyGuy { def mood = "sad" }
defined module LonelyGuy
scala> LonelyGuy
res0: LonelyGuy.type = LonelyGuy$@3449a8
scala> LonelyGuy.mood
res4: java.lang.String = sad
Run Code Online (Sandbox Code Playgroud)
使用案例类(实际上,下面有class + object = 伴随模式,例如,具有相同名称的类和对象):
scala> case class Foo(bar: String)
defined class Foo
scala> Foo("baz")
res2: Foo = Foo(baz)
Run Code Online (Sandbox Code Playgroud)
因此,当您使用简单的类时,规则与Java相同.
scala> class Foo(val bar: String)
defined class Foo
scala> new Foo("baz")
res0: Foo = Foo@2ad6a0
// will be a error
scala> Foo("baz")
<console>:8: error: not found: value Foo
Foo("baz")
Run Code Online (Sandbox Code Playgroud)
奖金,scala中有一个匿名类,可以像这样构造:
scala> new { val bar = "baz" }
res2: java.lang.Object{val bar: java.lang.String} = $anon$1@10ee5b8
scala> res2.bar
res3: java.lang.String = baz
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
32446 次 |
| 最近记录: |