Scala by Example - параметр типа черты с ошибкой границ контекста? - PullRequest
9 голосов
/ 20 декабря 2011

Чтение книги Scala by Example, и есть этот пример, когда Мартин объясняет границы типов на странице 54:

trait Set[A <: Ordered[A]] {
  def incl(x: A): Set[A]
  def contains(x: A): Boolean
}

и

trait Set[A <% Ordered[A]] ...

далее на странице 55. Он также говоритчто <: / <% - единственное изменение, необходимое для набора признаков, чтобы продемонстрировать возможности ограничения типов. </p>

Однако, когда я повторяю пример со своим собственным кодом, IDE жалуется, что признаки могут НЕ иметьпросматривать границы, только границы типа.Помогает изменение ключевого слова trait на абстрактный класс или изменение представления, связанного с привязкой к типу.Это ошибка в книге?

1 Ответ

7 голосов
/ 28 июня 2012

Давайте используем наш мощный инструмент 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 недостаточно зрелым для этого.Однако всегда есть место для улучшения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...