/ / Scala by Example - параметър тип черта с грешка в контекста на границите? - скала, изглед, черти

Скала по пример - параметър тип на чертата с грешка в контекста? - скала, изглед, черти

Четене на книгата 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. Той също така казва, че <: / <% е единствената промяна, необходима за набор от черти, за да се демонстрират възможностите за ограничаване на типа.

Когато обаче повтарям примера със собствения сикод, IDE се оплаква, че чертите НЕ могат да имат граници на изглед, само тип граници. Промяната на ключовата дума в абстрактен клас или промяната на изгледа, обвързан с типа, помага. Това ли е грешка в книгата?

Отговори:

7 за отговор № 1

Нека използваме нашия мощен инструмент, наречен 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 Function1 вътре в чертата и се попълва от компилатора?)

Относно въпроса ви за еволюцията на Scala,той е зрял и мощен. Можете да очаквате промени между основните версии (2.8, 2.9, 2.10), но не бих считал, че скалата не е достатъчно зряла за това. Винаги има място за подобрение