2015-06-02 4 views
1

Я нашел пример о члена абстрактного типа в работе Одерски (глава 2.1): http://lampwww.epfl.ch/~odersky/papers/ScalableComponent.pdfУстановить приватный var анонимным классом в Scala?

enter image description here


Я вставьте его ниже

abstract class AbsCell { 
    type T 
    val init: T 
    private var value: T = init 
    def get: T = value 
    def set(x:T):Unit = {value = x} 
} 


val cell = new AbsCell{ type T=Int; val init=1} 
cell.set(cell.get + 1) 
cell.get 

The кодов не работает, как ожидалось в последней версии Scala (Scala Version: 2.11).

Я нашел значение последнего выражения cell.get является 1, а то, что я ожидал, это 2. Причина заключается в том, что private var value: T = init не очень хорошо работает для подмешать анонимного класса { type T=Int; val init=1}.

У кого-нибудь есть идеи по этому поводу?

+0

В этом вопросе нет миксинов. Это обычный анонимный класс. Кроме того, я бы не добавил Java-тег. –

ответ

0

Ваш код не работает, поскольку value инициализирован доval init есть. Таким образом, в момент инициализации valueinit по-прежнему равен значению по умолчанию типа T, которое равно 0 для T = Int.

Вы можете исправить это, сделав init a def или lazy val.

Обратите внимание, что в документе, на котором вы ссылаетесь, отсутствует упомянутый вами код. В документе init является параметром конструктора GenCell/AbsCell и поэтому инициализируется должным образом до value.

+0

Вот скриншот статьи, где коды взяты из: http://i.stack.imgur.com/B2x3i.png Я не нашел 'init' в конструкторе' AbsCell' –

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