2016-11-16 2 views
0

Быстрый вопрос о том, почему мы не можем создавать экземпляры типов? Например, возьмем этот пример:Создание экземпляров Scala В результатах участвуют

abstract class SimpleApplicationLoader { 
    type MyComponents <: BuiltInComponentsFromContext 

    def load(context: Context) = { 
    new MyComponents(context).application 
    } 
} 

class SiteServiceApplicationLoader extends SimpleApplicationLoader { 
    type MyComponents = SiteApplicationComponents 
} 

class SiteApplicationComponents(val context: Context) extends BuiltInComponentsFromContext(context) { 
     .... 
} 

SimpleApplicationLoader определяет параметр типа MyComponents (верхняя граница к BuiltinComponentsFromContext). В методе load указан параметр типа MyComponents. SiteServiceApplicationLoader переопределяет тип MyComponents для _SiteApplicationComponents).

Во всяком случае, компилятор выдает следующую ошибку:

Error:(13, 9) class type required but SimpleApplicationLoader.this.MyComponents found 
    new MyComponents(context).application 

Просто любопытно, почему членов типа не инстанциируемые? Любые обходные пути?

Спасибо!

ответ

3

Оператор new доступен только для classes (or "like classes"). Тип не является классом, поэтому new недоступен.

Чтобы создать экземпляр произвольного типа, функция может быть использована

def newMyComponents(context: Context): MyComponents 

Update (спасибо @ Даниель-Werner)

Так что абстрактный класс будет выглядеть

abstract class SimpleApplicationLoader { 
    type MyComponents <: BuiltInComponentsFromContext 

    def newMyComponents(context: Context): MyComponents 

    def load(context: Context) = { 
    newMyComponents(context).application  
    } 
} 

Абстрактный метод может быть реализован в class, где определено type:

class SiteServiceApplicationLoader extends SimpleApplicationLoader { 
    type MyComponents = SiteApplicationComponents 
    def newMyComponents(context: Context): MyComponents = 
    new SiteApplicationComponents(context) 
} 
+0

Чтобы уточнить: Вы предлагаете добавить абстрактный метод 'newMyComponents' (который возвращает' MyComponents') в 'SimpleApplicationLoader'. Этот метод затем будет реализован в 'SiteServiceApplicationLoader'. Это верно? Поскольку это значение не стало на 100% понятным из первого примера кода. –

3

Вы не можете создать экземпляр типа. Вы можете создать экземпляр класса.

В вашем коде нет ничего, что ограничивало бы MyComponents как класс. Это также может быть чертой, одноэлементным типом, сложным типом или даже абстрактным классом, который также не может быть создан.

Другие языки имеют способы ограничить типы классами или иметь конструкторы. Например, в C♯ вы можете ограничить тип, который должен быть классом или структурой, с конструктором с нулевым аргументом. Но у Scala нет функции для таких ограничений.

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