Полное сообщение об ошибке
[error] trait Conc inherits different type instances of trait Data:
[error] C1Holder.Data and BaseHolder.Data
[error] trait Conc extends Abst with C1Holder.Data
[error] ^
[error] one error found
Это говорит о том, что (object BaseHolder).Data
не согласуется с (object C1Holder).Data
, поскольку, хотя последний соответствует (trait BaseHolder)#Data
, это менее специфично, чем trait Data
в единственном экземпляре object BaseHolder
.
Редактировать . Обратите внимание, что типы и значения находятся в разных пространствах имен, поэтому само имя BaseHolder
неоднозначно, оно может относиться либо к признаку объекта. Тем не менее, при ссылке на тип, "." или символ "#" устраняет неоднозначность:
T#Data
всегда означает элемент типа Data
в типе T
. Например, BaseHolder#Data
будет означать черту BaseHolder
.
x.Data
всегда означает элемент типа Data
в объекте x
. Например, BaseHolder.Data
будет относиться к одноэлементному объекту BaseHolder
.
Обратите внимание, что два экземпляра x
и y
из trait BaseHolder
будут иметь разные типы x.Data
и y.Data
; так работают зависимые от пути типы. Также обратите внимание, что object BaseHolder extends BaseHolder
- это только один конкретный экземпляр trait BaseHolder
.
Чтобы ваш код компилировался, убедитесь, что (trait C1Holder)#Data
действительно соответствует (object BaseHolder).Data
trait BaseHolder {
trait Data
}
object BaseHolder extends BaseHolder
trait C1Holder extends BaseHolder {
trait Data extends BaseHolder.Data // Here BaseHolder refers to singleton object
}
object C1Holder extends C1Holder
trait Abst extends BaseHolder.Data
trait Conc extends Abst with C1Holder.Data
В этом примере черты не так важны, так что вы можете просто пойти с
object BaseHolder {
trait Data
}
object C1Holder {
trait Data extends BaseHolder.Data
}
trait Abst extends BaseHolder.Data
trait Conc extends Abst with C1Holder.Data