Questa è in realtà una stranezza nella sintassi di Scala. È consentito un extends
estraneo prima di iniziare il corpo della classe. Qui ci sono le parti rilevanti del Scala Syntax Summary:
ClassDef ::= id [TypeParamClause] {ConstrAnnotation} [AccessModifier]
ClassParamClauses ClassTemplateOpt
ClassTemplateOpt ::= ‘extends’ ClassTemplate | [[‘extends’] TemplateBody]
ClassTemplate ::= [EarlyDefs] ClassParents [TemplateBody]
ClassTemplateOpt
è tutto ciò che segue i parametri della classe, in questo caso tutto da extends
in poi. L'uso normale di extends
è la prima alternanza di ClassTemplateOpt
, con extends
seguita da un genitore o da un inizializzatore anticipato. Tuttavia, un inizializzatore non può contenere uno def
e non è possibile interpretare il contenuto delle parentesi come genitore. Non può essere un tipo strutturale perché hi
ha una definizione concreta.
La seconda alternanza consente ai parametri della classe di essere immediatamente seguiti dal corpo della classe, senza utilizzare extends
. Tuttavia, è consentito un extends
opzionale. Il extends
nel codice di OP è un esempio di questo, ed è esattamente equivalente allo stesso codice senza opzionale estende:
class Some {
def hi = println("hi")
}
Gli esempi forniscono _sono_ digitazione strutturale, ma quello in questione non è. –
Considera 'type T = {def hi = println (" hi ")}' - non viene compilato, perché i tipi strutturali non possono avere definizioni. – wingedsubmariner