Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这是什么Scala';新';语法_Scala - Fatal编程技术网

这是什么Scala';新';语法

这是什么Scala';新';语法,scala,Scala,从ScalaTest文档中: class ExampleSpec extends FlatSpec { def fixture = new { val builder = new StringBuilder("ScalaTest is ") val buffer = new ListBuffer[String] } 我不明白这里怎么用这个新关键字。fixture显然是一个函数,它声明并返回。。。什么?它似乎是一个对象,因为它有可以通过访问的成员(生成器和缓冲区)。符号 这里创建的是

从ScalaTest文档中:

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中经常使用这种语法进行映射初始化,这是一种非常好的模式。