Давайте используем наш мощный инструмент REPL, чтобы понять, что происходит:
scala> trait Example[A<:Ordered[A]] { def contains(x:A):Boolean }
defined trait Example
scala> class Example2[A<%Ordered[A]]( val a:A) { def isLower(otherA:A):Boolean = a< otherA }
defined class Example2
scala> :javap Example
Compiled from "<console>"
public interface Example{
public abstract boolean contains(scala.math.Ordered);
}
scala> :javap Example2
Compiled from "<console>"
public class Example2 extends java.lang.Object implements scala.ScalaObject{
public java.lang.Object a();
public boolean isLower(java.lang.Object);
public Example2(java.lang.Object, scala.Function1);
}
Как вы можете видеть, граница представления становится вторым аргументом конструктора Example2.Поскольку признак не имеет конструктора, очевидно, что невозможно обеспечить привязку вида.
Почему это было возможно в предыдущих выпусках, для меня загадка (может быть, дополнительная функция Val была создана внутри черты и заполнена компилятором?)
Что касается вашего вопроса об эволюции Scala,это зрелый и мощный.Вы можете ожидать изменений между основными выпусками (2.8, 2.9, 2.10), но я бы не посчитал scala недостаточно зрелым для этого.Однако всегда есть место для улучшения