Нет.Смешивание в одной и той же черте возможно только в Scala, если два типа, с которыми эта характеристика (интерфейс) параметризуется с типами, которые соответствуют друг другу, и эта черта не смешивается в одном классе дважды непосредственно .Чтобы убедиться, что эти 2 типа соответствуют друг другу, вам обычно нужно сделать параметр типа ковариантным (+
).
Например, это недопустимо:
scala> trait A[+T] { def foo: T = sys.error() }
defined trait A
scala> class C extends A[AnyRef] with A[String]
<console>:8: error: trait A is inherited twice
class C extends A[AnyRef] with A[String]
Но это:
scala> trait A[+T] { def foo: T = sys.error() }
defined trait A
scala> class C extends A[AnyRef]
defined class C
scala> class B extends C with A[String]
defined class B
Обратите внимание, что в этом случае вы не получите семантику с перегрузкой , как в случае с C #, но семантику с переопределением - всеметоды в A
с соответствующей сигнатурой будут объединены в одном методе с наиболее конкретной сигнатурой, при этом метод выбирается в соответствии с правилами линеаризации вместо использования одного метода для каждого смешанного признакав.