2013-05-29 2 views
5

Из ScalaTest документы:Что в этом Scala «новый» синтаксис

class ExampleSpec extends FlatSpec { 

def fixture = 
new { 
    val builder = new StringBuilder("ScalaTest is ") 
    val buffer = new ListBuffer[String] 
} 

...

Я не понимаю, как новое ключевое слово используется здесь. fixture - это, очевидно, функция, которая декларирует и возвращает ... что? Кажется, это объект, поскольку он имеет элементы (builder & buffer), к которым можно получить доступ. нотации.

Это то, что создается здесь анонимным классом, который является подклассом AnyRef?

+1

Если вы хотите узнать больше об этом, обратите внимание на «структурную утонченность» или «структурных подтипы» – stew

+0

Я желаю я бы сказал «INSTANCE анонимного класса» вместо «анонимного класса» - перестановка «объекта» и «класса», являющегося одним из моих давних домашних животных. :) –

ответ

13

Да, он возвращает экземпляр любого класса. Это не трудно проверить это самостоятельно в 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 является лишь слегка более подробный синтаксис и имеет системный тип ограничения, что делает это в основном бесполезно. Подробнее об этом здесь http://james-iry.blogspot.com/2009/04/java-has-type-inference-and-refinement.html

+0

@JamesIry, но, к сожалению, в java сложнее использовать такие анонимные экземпляры не для создания (предполагая, что мы не используем никаких интерфейсов и классов). –

+1

Стоит отметить, что все методы, называемые объектом, определенным таким образом, вызываются отражением. –

+0

Хорошая точка Жан - но это должно быть объяснено, почему это важно, т. Е. Размышление дорого. – selig

Смежные вопросы