这是什么Scala';新';语法
从ScalaTest文档中:这是什么Scala';新';语法,scala,Scala,从ScalaTest文档中: class ExampleSpec extends FlatSpec { def fixture = new { val builder = new StringBuilder("ScalaTest is ") val buffer = new ListBuffer[String] } 我不明白这里怎么用这个新关键字。fixture显然是一个函数,它声明并返回。。。什么?它似乎是一个对象,因为它有可以通过访问的成员(生成器和缓冲区)。符号 这里创建的是
class ExampleSpec extends FlatSpec {
def fixture =
new {
val builder = new StringBuilder("ScalaTest is ")
val buffer = new ListBuffer[String]
}
我不明白这里怎么用这个新关键字。fixture显然是一个函数,它声明并返回。。。什么?它似乎是一个对象,因为它有可以通过访问的成员(生成器和缓冲区)。符号
这里创建的是一个匿名类,它是AnyRef的子类吗?是的,它返回anynomous类的实例。在REPL会话中自己检查并不困难:
scala> def fixture = new { val string = "mr. String" }
fixture: Object{val string: String}
信不信由你,Java可以做本质上相同的事情。以下是有效的Java
(new Object() {
public void sayHello() {
System.out.println("hello!");
}
}).sayHello();
Java版本只是一个稍微详细一些的语法,并且有一个类型系统限制,这使得它基本上是无用的。
这里有更多关于它的信息如果你想了解更多,请寻找“结构细化”或“结构子类型”我希望我说的是“匿名类的实例”而不是“匿名类”-“对象”和“类”的互换是我长期以来最讨厌的OO之一@JamesIry,但遗憾的是,在java中很难使用这种匿名实例来代替创建(假设我们不使用任何接口和类)值得一提的是,在这样定义的对象上调用的所有方法都是由反射调用的。Jean的观点很好,但应该解释为什么反射很重要,即反射很昂贵。嗯,我在Java中经常使用这种语法进行映射初始化,这是一种非常好的模式。